.prop ('проверено', ложь) или .removeAttr ('проверено')?

115

С введением метода prop мне теперь нужно знать общепринятый способ снятия флажка. Это:

$('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

use checked: true, false свойство флажка.

JQuery:

if($('input[type=checkbox]').is(':checked')) {
    $(this).prop('checked',true);
} else {
    $(this).prop('checked',false);
}
сурадж рават
источник
Мы можем устранить if, иначе, используя один лайнер, $ (this) .prop ('checked', $ ('input [type = checkbox]'). Is (': checked'));
Юсуф Хассан
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");
Rod
Я использую пользовательский компонент (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 () извлекает атрибуты.

Узнать больше ...

tonnoz
источник
2
Вопрос был «Какой из них более правильный?», А не «Есть ли другие способы сделать это?». Похоже, вы не пытались ответить на вопрос,
Эндрю Стаббс,