Подтвердить что ты не робот

Почему метод jQuery 1.9+ attr() не устарел?

Могу ли я, разработчик jQuery1.9 +, "отказаться" от использования метода attr() в моей повседневной работе?


Как показано во многих вопросах,

есть много путаницы в отношении "использования attr или использования prop?", и, с точки зрения моего (разработчика), для всех видов использования метода attr() вместо этого мы можем использовать prop:

  • обратная совместимость: кодирование нового программного обеспечения не нуждается в этом;
  • производительность: Джон говорит "Доступ к свойствам с помощью метода .attr() будет немного медленнее, чем доступ к ним напрямую через .prop()";
  • Изменить значение атрибута: все может быть изменено с помощью метода prop(name,newvalue).
  • Удалить атрибут: все можно удалить с помощью метода removeProp(name).
  • Проверьте значения атрибутов HTML: браузер использует DOM, весь HTML был преобразован в DOM, и, если DOM повлиял на метод attr(name). О "сильном типе" prop: лучше, чем "html string value" (например, "checked" vs true).
  • Проверьте, был ли атрибут определен в "исходном коде HTML" (если этот метод attr в вашем браузере возвращает undefined, если это не так)... Ну, нам это нужно в каком-то программном обеспечении? В формах метод ".val() является рекомендуемым способом jQuery для получения или установки значений формы"
  • Совместимость между браузерами: оба (не только attr) - это согласованные методы. (это??).

Итак, в это время (2013) я не вижу веских оснований использовать метод attr при разработке нового кода jQuery... Но, ну, это, другими словами, вопрос: Там являются хорошей причиной для использования метода attr в моих повседневных задачах?

4b9b3361

Ответ 1

Моя домашняя работа... После прочтения @cHao и @cernunnos хороших объяснений, и через несколько месяцев, используя это... Мне нужно другое понятие, чтобы решить, как программист, при использовании или отсутствии prop и attr:

  • Исходный код HTML и его представление: браузер загружает HTML-страницу в пространство памяти браузера. Хорошо, что пребывание в браузере памяти является представлением DOM, но DOM сохраняет некоторые оригинальные вещи, как атрибуты, и свойство cssText, которые являются "иногда сохраняемыми представлениями".
    PS: атрибуты, которые не определены в" стандартном DOM", не имеют сопоставления с свойствами DOM. Когда изменяется один атрибут (не только для чтения), если есть соответствующее (отображаемое) свойство, его можно изменить автоматически.

  • Состояние DOM: динамические страницы нуждаются в изменениях непосредственно в DOM, это то, что видят конечные пользователи. Итак, если на странице есть некоторые действия "щелчок и изменение", каждый раз, когда DOM переходит к новому представлению страницы, поэтому каждый раз, когда DOM имеет новый state.
    Когда изменяется одно свойство DOM, все остальные свойства DOM (при необходимости) изменяются последовательно.

С учетом этих понятий мы можем нарисовать правило (для attr vs prop uses) ":

  • Используйте prop, у вас есть 90% шансов, что он работает... 99%, если вы используете jQuery для изменения состояний DOM (и стандартной гипотезы DOM).
  • Если вам нужно изменить или получить доступ к атрибутам data-*, используйте метод .data().
  • В противном случае (не DOM, не-данные или нестандартные вещи) проверьте, есть ли случай использования .attr(), и зарезервируйте некоторое время для его изучения (см. ответы выше).

Ответ 2

.attr() не является устаревшим, потому что он полезен для того, для чего он создан, и является единственным правильным способом делать то, что он сделал (не используя функцию getAttribute), которая делает то же самое... или самостоятельно разбора HTML). Единственная причина, по которой мы вообще имеем это обсуждение, - это то, что jQuery (и некоторые старые браузеры (кашель IE cough)) неправильно скомпоновали атрибуты и свойства, и что путаница - это то, что они, по-видимому, зафиксировали в 1.9.

.attr() извлекает атрибуты, а .prop() извлекает свойства. Эти две разные вещи и всегда были официально (хотя DOM часто имеет свойство соответствовать атрибуту). Если у вас есть <p whatever="value">, где whatever не является атрибутом, который распознает браузер, вы должны использовать .attr() для получения значения атрибута. .prop() даже не сможет увидеть его в большинстве браузеров.

Когда вы заботитесь о полученном объекте DOM, используйте .prop(). Когда вам нужен фактический атрибут HTML, используйте .attr(). На самом деле это не то, ни другое; вы можете использовать оба в том же коде, и юниверс не будет взорваться даже один раз (при условии, что вы правильно их использовали).:) Просто используйте тот, который подходит для работы, которую вы делаете в то время, и прекратите попытки "осудить" вещи, которые не сломаны.

Ответ 3

Я взял на себя смелость подготовить для вас скрипку:

http://jsfiddle.net/5REVP/

Особенно эта часть:

<div id="example" style="padding:10px"></div>

console.log("style");
var styleAttr = $("#example").attr("style");
console.log(styleAttr); // You get "padding:10px"
var styleProp = $("#example").prop("style");
console.log(styleProp); // You get a CSSStyleDeclaration object

Пример "стиль" ясно показывает, что атрибут не совпадает с свойством (проверьте консоль).

Для удобства чтения, поддержки и обратной (а также прямой) совместимости вы всегда должны использовать правильные методы для заданной задачи, в противном случае существует вероятность того, что метод может перестать вести себя так, как вы это делали, -.attr() метод является примером этого.

.attr() используется для получения атрибутов элементов, атрибутами являются SGML термин, который относится к информации, содержащейся внутри теги элементов, вы можете легко прочитать эту информацию, проверив элементы.

  • Если вы получите атрибут "style" элемента, вы не получите никакой информации, отличной от той, которая специально написана в этом атрибуте.
  • Если вы установите атрибут "checked" флажка, вы либо получите "checked" , либо "".

.prop() используется для получения свойств DOM элементов.

  • Если вы получаете свойство "style", вы не получаете того, что написал дизайнер в атрибуте style, вы получаете все фактические свойства css элемента.
  • Если вы установите свойство "checked" флажка, вы получите true или false.

Ответ 4

.attr() только обращается к атрибутам HTML, тогда как .prop() будет извлекать свойства, не относящиеся к элементам HTML. См. Документацию:

Например, selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked и defaultSelected должны быть извлечены и установить с помощью метода .prop(). До jQuery 1.6 эти свойства были восстановлены с помощью метода .attr(), но это не было объем атр. Они не имеют соответствующих атрибутов и только свойства.

http://api.jquery.com/prop/