Як завадити користувачеві вводити текст у текстове поле, не відключаючи поле?


80

Я намагався:

$('input').keyup(function() {

   $(this).attr('val', '');

});

але він трохи видаляє введений текст після введення листа. Чи можна як-небудь завадити користувачеві повністю вводити текст, не вдаючись до вимкнення текстового поля?


є keydown()або keypress()більш ефективними?
ssell

Відповіді:


189

Альтернатива без Javascript, яку можна легко пропустити: чи можете ви використовувати readonlyатрибут замість disabledатрибута? Це запобігає редагуванню тексту у введенні, але браузери стилі вводу по-різному (рідше "сірий"), наприклад<input readonly type="text" ...>


4
Чесно кажучи, це, я б сказав, найкраще рішення.
Крістіан Манн,

3
Атрибут readonly не має значення, він просто повинен бути присутнім як у HTML 4.01, так і в HTML5 . Єдине, коли йому потрібне значення, це у дійсних документах XHTML (що надзвичайно рідко зустрічається в Інтернеті).
RobG

Це абсолютно правильно РобГ, я повинен був про це згадати. Також хочу зазначити, що цей атрибут повинен працювати для елементів текстового поля, і я думаю, що він працює і для прапорців / радіовходів.
Mike Mertsock

4
У цього методу є один мінус. Користувач все ще може клацнути на поле, роблячи його таким, ніби його можна редагувати. Якщо вони натиснуть backspace, щоб видалити те, що там, це може запустити функцію "назад" браузера. Невдалий досвід.
caltrop

1
Якщо є занепокоєння щодо користувальницької роботи або якщо стиль за замовчуванням поля для читання просто некрасивий, скористайтесь підходом до прогресивного вдосконалення та використовуйте CSS, щоб зробити більш очевидним, що його не можна редагувати: jsfiddle.net/eBh5N
Mike Mertsock

64

якщо ви не хочете, щоб поле виглядало "відключеним" або smth, просто скористайтеся цим:

onkeydown="return false;"

це в основному те саме, що сказали Грінгіт і Дерек, але трохи коротше


Мені довелося e.preventDefault();в addEventListener
Джим Джонс

3
ще коротше:onkeydown="return false"
CoderPi

4
Тільки майте на увазі, що це не заважає користувачеві вставляти текст за допомогою миші.
gsanta

2
Це ідеально підходить для використання датчика дати, наприклад, щоб запобігти користувачеві вводити дату та фактично використовувати датчик. Але, як сказав @gsanta, вони все одно зможуть вставити текст, тому просто переконайтеся, що у вас є і внутрішня перевірка :)
MattiasH

1
На веб-сайті ASP.NET встановлення текстового поля лише для читання призводить до втрати тексту в повідомленні назад. У таких випадках це найкраще рішення.
Ясс

30
$('input').keydown(function(e) {
   e.preventDefault();
   return false;
});

2
насправді, у мене є поле дати народження, і я хочу запобігти цьому, щоб користувач не вводив текст, тож для мене ваша відповідь ДОБРА !! Якщо я використовую атрибут "readonly", тоді користувач не зможе натиснути на введення та спливаюче вікно DOB, яке проходить через "Клацніть на введенні". та подяка
Neeraj Singh

16
$('input').keypress(function(e) {
    e.preventDefault();
});

2
Це лише унеможливить введення, тоді як ви все ще можете використовувати клавіші зі стрілками тощо. Дякую!
CoderPi

7

Якщо ви хочете заборонити користувачеві що-небудь додавати, але надайте йому можливість стирати символи:

<input value="CAN'T ADD TO THIS" maxlength="0" />

Встановлення maxlengthатрибуту введення "0"робить так, що користувач не може додавати вміст, але все одно стирає вміст, як хоче .


Але якщо ви хочете, щоб воно було справді постійним і незмінним:

<input value="THIS IS READONLY" onkeydown="return false" />

Встановлюючи onkeydownатрибут, return falseзмушує вхід ігнорувати користувача keypressesна ньому, тим самим не даючи їм змінювати або впливати на значення.


2

Ще один метод, який може бути використаний залежно від потреби, $('input').onfocus(function(){this.blur()}); я думаю, що так би ви його написали. Я не володію jquery.


1

Розмітка

<asp:TextBox ID="txtDateOfBirth" runat="server" onkeydown="javascript:preventInput(event);" onpaste="return false;"
                                TabIndex="1">

Сценарій

function preventInput(evnt) {
//Checked In IE9,Chrome,FireFox
if (evnt.which != 9) evnt.preventDefault();}

Це допоможе вам застосувати функціональність вкладок у файлі DatePicker Filed та запобігти редагуванню.
Biju kalanjoor

1

Мені подобається додати такий, який також працює з динамічним створенням DOM у JavaScript, як D3, де неможливо додати:

//.attr(function(){if(condition){"readonly"]else{""}) //INCORRECT CODE !

для запобігання дії над елементом DOM вводу HTML додайте клас лише для читання:

var d = document.getElementById("div1");
d.className += " readonly";

АБО в D3:

 .classed("readonly", function(){
   if(condition){return true}else{return false}
 })

І додати до CSS або менше:

.readonly {
  pointer-events: none;
}

приємна річ цього рішення полягає в тому, що ви можете динамічно вмикати і включати його у функції, щоб вона могла бути інтегрована, наприклад, у D3 під час створення (неможливо з одним атрибутом "тільки для читання").

щоб видалити елемент з класу:

document.getElementById("MyID").className =
  document.getElementById("MyID").className.replace(/\breadonly\b/,'');

або скористайтеся Jquery:

$( "div" ).removeClass( "readonly" )

або переключити клас:

$( "div" ).toggleClass( "readonly", addOrRemove );

Щоб бути повним, удачі = ^)


1

просто використовуйте onkeydown = "return false" до контрольного тегу, як показано нижче, він не буде приймати значення від користувача.

    <asp:TextBox ID="txtDate" runat="server" AutoPostBack="True"
ontextchanged="txtDate_TextChanged" onkeydown="return false" >
    </asp:TextBox>

0

Один із варіантів - прив’язати обробник до inputподії.

Перевага цього підходу полягає в тому, що ми не перешкоджаємо поведінці клавіатури, яку очікує користувач (наприклад, вкладка, сторінка вгору / вниз тощо).

Ще однією перевагою є те, що він також обробляє випадок, коли вхідне значення змінюється шляхом вставки тексту через контекстне меню.

Цей підхід найкраще працює, якщо ви дбаєте лише про те, щоб введення не було порожнім. Якщо ви хочете зберегти конкретне значення, вам доведеться відстежувати це десь ще (в атрибуті даних?), Оскільки воно не буде доступне під час отримання inputподії.

const inputEl = document.querySelector('input');

inputEl.addEventListener('input', (event) => {
  event.target.value = '';
});
<input type="text" />

Перевірено в Safari 10, Firefox 49, Chrome 54, IE 11.


0

Для рішення лише для css спробуйте налаштувати pointer-events: noneна вході.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.