Як додати атрибут "тільки для читання" до <input>?


301

Як я можу додати readonlyпевне <input>? .attr('readonly')не працює.


2
.attr ('readonly', правда) працює, інше dont
Qiao

3
.attr ('readonly', 'readonly') також працює
Qiao

3
Це залежить від того, яким DOCTYPE ви користуєтесь. Для HTML 4.01 DTD відповідь CMS працює і дійсний HTML 4.01. Якщо ви використовуєте XHTML DTD, то відповідь від ceejayoz працює і дійсний XHTML.
bjoernwibben

2
Це не залежить від doctype, DOM є тим самим, чи читався він через HTML або XML, і в будь-якому випадку XHTML майже завжди все-таки насправді служить HTML, а не XML, для сумісності IE.
bobince

Відповіді:


545

jQuery <1.9

$('#inputId').attr('readonly', true);

jQuery 1.9+

$('#inputId').prop('readonly', true);

Детальніше про різницю між опорою та attr


1
Ти впевнений? Я так подумав, але нічого не можу знайти у специфікаціях. <input name = "foo" readonly = "readonly" value = "bar" /> ідеально перевіряється у validator.w3.org з суворою xhtml 1.0.
Jonas Stensved

17
Цю посаду слід змінити на .prop (), а не на .attr (), як зазначено в API jQuery: jquery.com/upgrade-guide/1.9/#attr-versus-prop-
frshca

Атрибут readonly - це "логічний атрибут" - whatwg.org/specs/web-apps/current-work/#boolean-attribute Незважаючи на дещо оманливе ім'я, значення не повинні бути "істинними" або "помилковими". Хоча я думаю, що наведений вище код насправді спрацює (тестується в Chrome з jQuery 1.8.1), це може призвести до пізньої плутанини для недосвідчених. Також згідно з документами jQuery значення повинно бути числом або рядком, а не булевим. api.jquery.com/attr/#attr2
Лука

151

Використовуйте $ .prop ()

$("#descrip").prop("readonly",true);

$("#descrip").prop("readonly",false);

8
Прочитавши API jQuery для .prop, це має бути прийнятою відповіддю. Я завжди робив .attr ('readonly', 'readonly') і .removeAttr ('readonly') у минулому, але це здається більш правильним і робить код також чистішим.
evan w

4
Усі повинні використовувати цю відповідь, як зазначено тут: jquery.com/upgrade-guide/1.9/#attr-versus-prop-
frshca

4
Обережне слово з використанням $.prop(): Prop встановить атрибут readonly в порожній / порожній рядок, тому якщо у вас є будь-який CSS, для якого використовується селектор атрибутів [readonly="readonly"], то вам доведеться змінити це на [readonly](або включити обидва).
Лука

28

Readonly - це атрибут, визначений у html, тому ставитесь до нього як до одного.

Вам потрібно мати щось на зразок readonly = "readonly" в об'єкті, з яким ви працюєте, якщо ви хочете, щоб воно не могло редагуватися. І якщо ви хочете, щоб він знову був редагований, у вас не буде щось на кшталт readonly = '' (це не стандартно, якщо я правильно зрозумів). Вам дійсно потрібно видалити атрибут в цілому.

Таким чином, при використанні jquery додавання та видалення його має сенс.

Встановіть щось лише заново:

$("#someId").attr('readonly', 'readonly');

Видалити лише заново:

$("#someId").removeAttr('readonly');

Це була єдина альтернатива, яка справді працювала для мене. Сподіваюся, це допомагає!


20

.attr('readonly', 'readonly')повинен зробити трюк. Ви .attr('readonly')повертаєте лише значення, воно не встановлює.


16
attr () jQuery працює на властивостях JavaScript, а не на атрибутах HTML, хоча імена означають інше. attr ('readonly') насправді працює на DOM рівня 1, властивість HTML readOnly, що є булевим, тому 'true' є більш доречним. Однак рядок "readonly" - це також імовірне значення при автоматичному перетворенні на булеве, тому вищезазначене все ще працює.
bobince

Я не думаю, що ти хочеш встановлювати атрибут "true". .attrЗначення має бути тільки рядком або числом, а чи не логічного значення, в відповідно до Jquery Docs: api.jquery.com/attr/#attr2 Крім того , HTML «Булеві атрибути» повинні бути тільки порожній рядок або значення атрибута. Я думаю, що рішення - використовувати, .prop()щоб уникнути плутанини.
Лука

16

Я думаю, що "вимкнено" виключає вхід із відправки на пошту


4
Так. Я знайшов цю тему під час пошуку альтернативи "інваліду" саме з цієї причини.
Jonas Stensved

але ви можете ввімкнути його безпосередньо перед надсиланням та відключити пізніше $ (document) .on ('submit', "#myform", function (e) {// enable inputs return true; // потім знову відключити його, якщо ви вимагають} працює, я перевірив її
Geomorillo

Чи дозволено надсилати на POST лише введені значення в HTML, не використовуючи приховані?
Аджай Такур

12

Вимкнути читання можна лише за допомогою .removeAttr;

$('#descrip').removeAttr('readonly');

5

Для ввімкнення лише читання:

$("#descrip").attr("readonly","true");

Для відключення лише заново

$("#descrip").attr("readonly","");

Від api.jquery.com/attr "Станом на jQuery 1.6, метод .attr () повертає невизначений для атрибутів, які не були встановлені. Для отримання та зміни властивостей DOM, таких як перевірений, вибраний або вимкнений стан елементів форми, використовуйте метод .prop (). "
Девід Кларк

1
Атрибут не повинен бути встановлений у рядку "true". Це може працювати, але технічно не правильно. (Дивіться мої попередні коментарі вище.)
Лука

Не використовуйте цю пропозицію, набагато кращі з них доступні тут. "true" не є правильним для налаштування, а видалення також невірно.
MiFiHiBye

4

Використовуйте властивість setAttribute. У прикладі зауважте, що якщо вибрано 1, застосуйте атрибут readonly у текстовому полі, інакше видаліть атрибут лише заново.

http://jsfiddle.net/baqxz7ym/2/

document.getElementById("box1").onchange = function(){
  if(document.getElementById("box1").value == 1) {
    document.getElementById("codigo").setAttribute("readonly", true);
  } else {
    document.getElementById("codigo").removeAttribute("readonly");
  }
};

<input type="text" name="codigo" id="codigo"/>

<select id="box1">
<option value="0" >0</option>
<option value="1" >1</option>
<option value="2" >2</option>
</select>

-4

Для версії jQuery <1.9:

$('#inputId').attr('disabled', true);

Для версії jQuery> = 1.9:

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