В чем разница между removeProp и removeAttr в JQuery 1.6? - PullRequest
9 голосов
/ 05 мая 2011

Если вы удалите Prop для чего-то, что вы должны были использовать removeAttr(), произойдет ли это молча?Это будет работать?Будет ли он фактически удалять весь атрибут или только значение внутри него?

Если checked добавляется с помощью removeProp(), можно ли его удалить с помощью removeAttr()?

Много вопросов!

Ответы [ 3 ]

7 голосов
/ 05 мая 2011

Официальный блог jQuery дает очень четкое объяснение:

В версии 1.6 мы разделили обработку атрибутов DOM и свойств DOM на отдельные методы.Новый метод .prop () устанавливает или получает свойства для элементов DOM, а .removeProp () удаляет свойства.В прошлом jQuery не проводил четкой границы между свойствами и атрибутами.Как правило, атрибуты DOM представляют информацию о состоянии DOM, полученную из документа, например атрибут value в разметке.Свойства DOM представляют динамическое состояние документа;например, если пользователь щелкает в элементе ввода выше и набирает def, то .prop("value") - это abcdef, но .attr("value") остается abc.

В большинстве случаев браузер обрабатывает значение атрибута как начальное значение длясвойство, но логические атрибуты, такие как флажок или отключен, имеют необычную семантику.

Например, рассмотрим разметку <input type="checkbox" checked>.Наличие проверенного атрибута означает, что свойство DOM .checked имеет значение true, даже если у атрибута нет значения.В приведенном выше коде проверяемое значение атрибута представляет собой пустую строку (или undefined, если атрибут не указан), но проверяемое значение свойства равно true.

До того, как jQuery 1.6, .attr("checked") вернул логическое значениезначение свойства (true), но начиная с jQuery 1.6 он возвращает фактическое значение атрибута (пустую строку), которое не изменяется, когда пользователь нажимает флажок, чтобы изменить его состояние.

Естьнесколько альтернатив для проверки текущего проверенного состояния флажка.Лучшим и наиболее эффективным является непосредственное использование свойства DOM, как в this.checked внутри обработчика событий, когда он ссылается на элемент, по которому был выполнен щелчок.В коде, использующем jQuery 1.6 или новее, новый метод $(this).prop("checked") извлекает то же значение, что и this.checked, и является относительно быстрым.Наконец, выражение $(this).is(":checked") работает для всех версий jQuery.

5 голосов
/ 05 мая 2011

Атрибут элемента - это что-то вроде «класса». Принимая во внимание, что его свойство будет 'className'.

Это причина для добавления jQuery.prop и jQuery.propHooks в версию 1.6, чтобы облегчить работу с обоими.

Таким образом, если свойство имело то же имя, что и атрибут, вы можете использовать и removeProp, или removeAttr.

Я задал похожий вопрос на форуме jQuery, получил ответ:

Да, attr предназначен для атрибутов html как они строго определены. опора для свойств. Так, например, скажем у вас есть узел Elem с классом «что-то» (необработанный элемент не JQuery объект). elem.className является собственность, но где атрибут находится. Смена класса Атрибут также меняет свойство автоматически и наоборот. В настоящее время attr перемешан и сбивает с толку, потому что он пытался работа обеих функций и есть много ошибок из-за этого. введение jQuery.fn.prop будет решить несколько блокировщиков, отдельный код как это должно было быть отделено от начало и дай разработчикам более быстрые функции, чтобы делать то, что они ожидайте, что они сделают. Позвольте мне составить процент за секунду и сказать, что из мой опыт поддержки IRC и чтение чужого кода, 95% использования чехлы для attr переключать не придется поддержать.

EDIT

Лучше всего придерживаться jQuery.attr или jQuery.prop. Theres, кажется, несколько странное поведение при установке и удалении отмеченного атрибута с использованием обоих.

См. Здесь пример: http://jsfiddle.net/tomgrohl/uTCJF/

В версии 1.6 есть ошибка, связанная с выбранным: http://bugs.jquery.com/ticket/9079

0 голосов
/ 24 августа 2011

Используя jQuery 1.6, я пытался клонировать пункт меню, который имел несколько атрибутов id, и я сделал это:

$('ul.menu').clone().filter('*').removeProp('id').appendTo('.sidebar');

Когда я проверял элементы в Firebug, у меня было много id="undefined" - не то, что я хотел. Так что теперь я использую removeAttr, и, кажется, он работает намного лучше.

$('ul.menu').clone().filter('*').removeAttr('id').appendTo('.sidebar');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...