.prop ("перевірено", помилково) або .removeAttr ("перевірено")?


115

З впровадженням методу опори тепер мені потрібно знати прийнятий спосіб зняти прапорець. Є це:

$('input').filter(':checkbox').removeAttr('checked');

або

$('input').filter(':checkbox').prop('checked',false);

4
Ви читали пост Джона Ресіга? ejohn.org/blog/jquery-16-and-attr
Джаред Фарріш

Відповіді:


130

jQuery 3

Станом на jQuery 3, removeAttrбільше не встановлює відповідну властивість false:

Перед JQuery 3.0, використовуючи .removeAttr()на булевої атрибуті , такі як checked, selectedабо readonlyб також встановити відповідне ім'я властивість false. Така поведінка була потрібна для стародавніх версій Internet Explorer, але не є правильною для сучасних браузерів, оскільки атрибут представляє початкове значення, а властивість представляє поточне (динамічне) значення.

Майже завжди є помилкою використовувати .removeAttr( "checked" )елемент DOM. Єдиний раз, коли це може бути корисним, це якщо DOM пізніше буде серіалізований назад до рядка HTML. У всіх інших випадках .prop( "checked", false )замість цього слід використовувати.

Журнал змін

Отже, лише .prop('checked',false)правильний спосіб використання цієї версії.


Оригінальна відповідь (з 2011 року):

Для атрибутів, що мають основні булеві властивості (з них checkedодна), removeAttrавтоматично встановлюється базове властивість на false. (Зауважте, що це одне з "виправлень", сумісних із зворотною сумісністю, доданих у jQuery 1.6.1).

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


36
@tandu: Можна , але не слід. З документів: " Примітка: Не використовуйте [ removeProp()] для видалення нативних властивостей, таких як перевірені, відключені або вибрані. Це повністю вилучить властивість і, як тільки буде видалено, не може бути додано знову до елемента. Використовуйте .prop()для встановлення цих властивостей на значення false замість цього ". removePropдійсно призначений для використання лише зі спеціальними властивостями.
Джон Плоскість

17

використання checked: true, false властивість прапорця.

jQuery:

if($('input[type=checkbox]').is(':checked')) {
    $(this).prop('checked',true);
} else {
    $(this).prop('checked',false);
}

Ми можемо усунути, якщо, в іншому випадку, використовуючи один вкладиш, $ (this) .prop ('check', $ ('input [type = checkbox]'). Is (': Позначено'));
Юсаф Хассан

8

Я рекомендую використовувати обидва, prop та attr, оскільки у мене були проблеми з Chrome, і я вирішив це за допомогою обох функцій.

if ($(':checkbox').is(':checked')){
    $(':checkbox').prop('checked', true).attr('checked', 'checked');
}
else {
    $(':checkbox').prop('checked', false).removeAttr('checked');
}

Так, для хромування використовуйте: $("input[type='checkbox'], input[type='radio']").prop("checked", false).attr("checked", false).removeAttr("checked");
Род

Я використовую спеціальний компонент (CSS + JS) для заміни вхідного радіо та прапорця. Це єдиний спосіб, який працює для мене. Дякую!
Сільвіо Дельгадо

3

Інша альтернатива зробити те ж саме - фільтрувати за атрибутом type = checkbox :

$('input[type="checkbox"]').removeAttr('checked');

або

$('input[type="checkbox"]').prop('checked' , false);

Зауважте, що різниця між атрибутами та властивостями може бути важливою в конкретних ситуаціях. Перед jQuery 1.6 метод .attr () іноді враховував значення властивостей під час пошуку деяких атрибутів, що може спричинити непослідовність поведінки. Як і в jQuery 1.6, метод .prop () забезпечує спосіб явного пошуку значень властивостей, а .attr () отримує атрибути.

Знай більше ...


2
Питання було "Хто з них є більш правильним", а не "Чи існують інші способи цього зробити?". Ви, схоже, не намагалися відповісти на питання
Andrew Stubbs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.