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

Могу ли я, разработчик программного обеспечения jQuery 1.9+, «осудить» использование метода attr() в моей повседневной работе?


Как показали многие вопросы,

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

  1. обратная совместимость: для написания нового программного обеспечения это не требуется;
  2. производительность: Джон говорит "Доступ к свойствам через Метод .attr() будет немного медленнее, чем доступ к ним напрямую через .prop()";
  3. Изменить значение атрибута: все можно изменить методом prop(name,newvalue).
  4. Удалить атрибут: все можно удалить методом removeProp(name).
  5. Проверить значения атрибутов HTML: браузер использует DOM, весь HTML был преобразован в DOM, и, если DOM влияет на метод attr(name), это также влияет. О «сильном типе» реквизита: это лучше, чем «значение строки html» (например, «проверено» против true).
  6. Проверить, был ли атрибут определен в "исходном HTML-коде" (предположим, что метод attr в вашем браузере возвращает undefined, если это не так)... Что ж, нам нужно это в каком-то софте? В формах рекомендуемым методом jQuery является ".val() способ получить или установить значения формы"
  7. Консистентность между браузерами: оба метода (не только attr) являются согласованными. (это??).

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


person Peter Krauss    schedule 25.02.2013    source источник
comment
2) Вы все равно этого не делаете 3) нет 4) нет 5) DOM по-прежнему отличает атрибуты от свойств 6) Вам никогда не нужно get источник страницы   -  person Bergi    schedule 26.02.2013
comment
Ни один из ответов полностью не отвечает на ваш вопрос? Я бы сказал, что некоторые из них приемлемы.   -  person Joel Peltonen    schedule 17.12.2013
comment
Извините, я думаю, что ответы prop-vs-attr были продублированы, и люди не видят фокус вопрос (о лучших практиках, а не о prop-vs-attr концепции)... Как вы предложили, теперь я нажимаю на принятый ответ, но не люблю голосовать за свой ответ, особенно если он не получил голосов.   -  person Peter Krauss    schedule 17.12.2013
comment
Теперь я вижу (2014 г.), что этот вопрос получил много просмотров страниц (!), но я не выразил его в одной фразе-вопросе, чтобы отличить его от приведенных похожих вопросов/ответов... Итак, пытаясь выразить: можем ли мы составить эмпирическое правило для attr и prop наиболее частого использования DOM?, или Что является наиболее частым использованием DOM?.. , И, извините, возможно, из-за моего экспресс-менее или плохого английского: только я разместил здесь прямой ответ для такого рода позиции< /а>. Большинство других ответов являются копиями этих   -  person Peter Krauss    schedule 31.10.2014


Ответы (4)


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

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

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

person cHao    schedule 25.02.2013
comment
Показательный пример: <span data-foo="bar" data-whatsit="xyz"> Если вы используете attr("data-foo"), вы получите обратно "bar". Если вы используете prop, то нет, вы получаете undefined. Вы можете использовать data, но это заставит jQuery создать объект данных для вашего span и предварительно заполнить его всеми атрибутами data-* элемента, что не нужно, если все, что вам нужно, это получить data-foo как одноразовый. - person T.J. Crowder; 25.02.2013
comment
@cHao. Да, но в том-то и дело: программирование jQuery — это программирование DOM, и ВСЕ атрибуты HTML были сопоставлены с объектами DOM... Так что, я думаю, для 99,9% приложений jQuery мне не нужно использовать attr. - person Peter Krauss; 25.02.2013
comment
@PeterKrauss: Избегая этого, нет никакой цели. Не пытайтесь изо всех сил сделать это, это просто ненужно. - person T.J. Crowder; 25.02.2013
comment
@PeterKrauss: Не все. Все, что не поддерживается вашим браузером, не будет иметь связанного свойства. Все, что не стандартно... то же самое. И Т. Д. - person cHao; 25.02.2013
comment
Я думаю, что ОП хочет спросить, может ли он перестать использовать attr в повседневных задачах. И если предположить, что он не использует нестандартный HTML, я бы сказал, что он может осудить его в своей работе на основе вашего ответа, а не вашего заключения? - person Nanne; 25.02.2013
comment
Кажется, довольно часто используется .attr("data-somename"), но если он вам никогда не понадобится, значит, он вам никогда не понадобится. - person Kevin B; 25.02.2013
comment
@Краудер. Хм... да, теперь у меня есть подсказка (!спасибо), но я еще не убедился, что она имеет более 0,1% релевантности... - person Peter Krauss; 25.02.2013
comment
@Нэнн: Эх. Его следует прекратить использовать для задач, не связанных с проверкой атрибутов. Если есть свойство, которое лучше подходит для этой цели, используйте вместо него .prop(). В противном случае .attr() все еще определенно имеет свое место. - person cHao; 25.02.2013
comment
Но это был вопрос (признаюсь, не слишком хорошо написанный), и вы не добавили это к своему ответу? :смущенный: - person Nanne; 25.02.2013
comment
@PeterKrauss: вы также можете не использовать циклы for, если хотите. Дело в том, зачем тебе это? Это бесполезно. Используйте правильный инструмент для работы. Если вы получаете атрибут, используйте attr. - person T.J. Crowder; 25.02.2013
comment
@Nanne: Вопрос был в том, есть ли веская причина для его использования? Нет Когда я должен прекратить его использовать? :П - person cHao; 25.02.2013
comment
@Nanne: Вы можете опубликовать такой ответ, если хотите. Я, например, понизил бы это как просто неправильное, есть есть веские причины. Если вы обращаетесь к атрибуту, используйте attr. Не крайний случай, обычный случай. - person T.J. Crowder; 25.02.2013
comment
@ T.J.Crowder: я не публикую это как ответ, так как не знаю правильного ответа. (Я бы просто скопировал этот ответ, и это было бы бесполезно). Возможно, разница во мнениях больше связана с повседневным использованием, и я бы предпочел, чтобы вопрос был отредактирован, чтобы отразить более простую проблему (зачем использовать attr()). - person Nanne; 25.02.2013
comment
@Nanne Основной пример - нестандартные / настраиваемые атрибуты - это не случайность, это то, что большинство людей, пишущих JavaScript, собираются (или должны) часто использовать, поэтому я бы сказал, что это определенно подпадает под определение повседневное использование. - person Anthony Grist; 25.02.2013

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

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, относящийся к информации, содержащейся внутри тегов элементов, вы можете легко прочитать эту информацию, просмотрев элементы.

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

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

  • Если вы получаете свойство «стиль», вы не получаете то, что дизайнер написал в атрибуте стиля, вы получаете все фактические свойства css элемента.
  • Если вы получите свойство «checked» флажка, вы получите true или false.
person cernunnos    schedule 25.02.2013
comment
@cernunnos, спасибо за хорошее объяснение и хорошие подсказки ... Я хочу сказать, что программирование jQuery - это программирование DOM, и все атрибуты HTML были сопоставлены с объектами DOM ... Итак, я думаю, для 99,9% приложений jQuery , мне не нужно использовать attr. Как разработчик я вижу, что style object лучше, чем string для 99% приложений. - person Peter Krauss; 25.02.2013
comment
На самом деле большинство плагинов jQuery манипулируют атрибутами, а не свойствами (обычно одно ведет к другому, но это не одно и то же). Когда цель состоит в том, чтобы манипулировать интерфейсом (html), всегда лучше манипулировать атрибутами, потому что другие плагины/модули ожидают, что любое соответствующее поведение, отличное от поведения по умолчанию, будет видимым. Я думаю, что вам редко нужно изменять свойства элементов, но доступ к ним является обычным явлением (свойство checkbox для флажка). - person cernunnos; 25.02.2013
comment
+1 (styleотличный пример!) Придирка @FrédéricHamidi придирка: Что касается HTML5, HTML больше не является приложением SGML: Некоторые более ранние версии HTML... были основаны на SGML и использовали правила синтаксического анализа SGML. Однако немногие (если вообще были) веб-браузеры когда-либо реализовывали настоящий синтаксический анализ SGML для HTML-документов... Возникшая путаница... привела к потере десятилетий продуктивности. Таким образом, эта версия HTML возвращается к основе, отличной от SGML. Хотя я и придираюсь к себе, это не означает, что мы не говорим об атрибутах в смысле SGML. :-) - person T.J. Crowder; 25.02.2013
comment
@T.J., отличное замечание. Мне нравится, как они говорят некоторые более ранние версии HTML вместо практически все более ранние версии :) - person Frédéric Hamidi; 25.02.2013
comment
@FrédéricHamidi: Вполне. По сути, не было HTML1, поэтому HTML2–HTML4 — довольно большой набор. :-) - person T.J. Crowder; 25.02.2013
comment
отличная работа над ответом, я не знал о разнице, и этот пример сделал ее предельно ясной! - person Tony; 30.10.2014

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

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

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

person Joshua    schedule 25.02.2013

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

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

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

Имея в виду эти концепции, мы можем составить «эмпирическое правило (для attr и prop использования)»:

  1. Используйте prop, у вас есть 90% шансов, что это сработает... 99%, если вы используете jQuery для изменения состояний DOMстандартной гипотезы DOM).
  2. Если вам нужно изменить или получить доступ к data-* атрибутам, используйте метод .data().
  3. В противном случае (не DOM, не данные или нестандартные вещи) проверьте, есть ли случай использования .attr(), и зарезервируйте время для его изучения (см. ответы выше).
person Peter Krauss    schedule 15.07.2013
comment
немного оффтоп, но почему, если этот ответ ПРИНЯТ, он не находится поверх других? Обычно принятый идет первым, даже если другие ответы набрали больше голосов... Вот он ПОСЛЕДНИЙ! - person DiegoDD; 03.07.2014
comment
@DiegoDD, извини несколько месяцев спустя... Поскольку НИКТО не читает вопрос, это другой вопрос, чем приведенные аналогии... Ответы здесь, в то время, все только КОПИРОВАТЬ /ВСТАВЛЕНО ответы от похожих. - person Peter Krauss; 31.10.2014