Так что в jQuery 1.6 появилась новая функция prop()
.
$(selector).click(function(){
//instead of:
this.getAttribute('style');
//do i use:
$(this).prop('style');
//or:
$(this).attr('style');
})
или в этом случае они делают то же самое?
И если я действительно должен перейти к использованию prop()
, все старые attr()
вызовы сломается , если я перейти на 1.6?
ОБНОВИТЬ
selector = '#id'
$(selector).click(function() {
//instead of:
var getAtt = this.getAttribute('style');
//do i use:
var thisProp = $(this).prop('style');
//or:
var thisAttr = $(this).attr('style');
console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>
(см. также эту скрипку: http://jsfiddle.net/maniator/JpUF2/ )
Консоль регистрирует getAttribute
как строку, а attr
как строку, но как prop
как. CSSStyleDeclaration
Почему? И как это повлияет на мое кодирование в будущем?
Ответы:
Обновление 1 ноября 2012
Мой оригинальный ответ относится конкретно к jQuery 1.6. Мой совет остается тем же, но jQuery 1.6.1 немного изменил ситуацию: перед лицом предсказанной кучи сломанных веб-сайтов команда jQuery вернулась
attr()
к чему-то близкому (но не совсем такому) к своему старому поведению для логических атрибутов . Джон Ресиг также написал об этом в блоге . Я вижу трудности, с которыми они столкнулись, но все еще не согласен с его рекомендациейattr()
.Оригинальный ответ
Если вы когда-либо использовали jQuery, а не DOM напрямую, это может привести к путанице, хотя концептуально это определенно улучшение. Не очень хорошо для миллиардов сайтов, использующих jQuery, которые в результате этого изменения сломаются.
Я подведу итоги по основным вопросам:
prop()
а неattr()
.prop()
делает то , чтоattr()
делал. Замена вызововattr()
сprop()
в ваш код будет работать вообще.checked
свойство является логическим,style
свойство является объектом с индивидуальными свойствами для каждого стиля,size
свойство является числом.value
иchecked
: для этих атрибутов свойство всегда представляет текущее состояние, в то время как Атрибут (кроме старых версий IE) соответствует значению по умолчанию / проверяемости ввода (отражается в свойствеdefaultValue
/defaultChecked
).Если вы являетесь разработчиком jQuery и весь этот бизнес смущен свойствами и атрибутами, вам нужно сделать шаг назад и немного узнать об этом, поскольку jQuery больше не пытается так сильно оградить вас от этого. Для авторитетного, но несколько сухого слова по теме, есть спецификации: DOM4 , HTML DOM , DOM Level 2 , DOM Level 3 . Документация Mozilla по DOM действительна для большинства современных браузеров и ее легче читать, чем спецификации, поэтому вы можете найти их справку по DOM полезной. Там есть раздел о свойствах элемента .
В качестве примера того, как со свойствами проще работать, чем с атрибутами, рассмотрим флажок, который изначально установлен. Вот два возможных фрагмента правильного HTML для этого:
Итак, как вы узнаете, если флажок установлен с помощью jQuery? Посмотрите на переполнение стека, и вы обычно найдете следующие предложения:
if ( $("#cb").attr("checked") === true ) {...}
if ( $("#cb").attr("checked") == "checked" ) {...}
if ( $("#cb").is(":checked") ) {...}
На самом деле это самая простая вещь в мире,
checked
связанная с логическим свойством, которое существует и работает безупречно во всех основных скриптовых браузерах с 1995 года:if (document.getElementById("cb").checked) {...}
Свойство также делает проверку или снятие флажка тривиальным:
document.getElementById("cb").checked = false
В jQuery 1.6 это однозначно становится
$("#cb").prop("checked", false)
Идея использования
checked
атрибута для создания сценария флажка бесполезна и не нужна. Недвижимость то, что вам нужно.checked
атрибутаисточник
value
пример Тима , например. Вызываемая функция,attr
которая извлекает свойство,value
а не атрибут «значение», не имеет особого смысла (и они могут отличаться). Движение вперед,attr
выполнение атрибутов иprop
создание свойств будет более понятным, хотя для некоторых переход будет болезненным. Не поймите это неправильно, нет ничего лучше, чем вернуться назад и прочитать спецификации, чтобы понять, что это за свойства.value
например), но давайте попробуем в основном игнорировать это. 99% времени вы хотите работать с реквизитом. Если вам нужно работать с реальным атрибутом, вы, вероятно, об этом знаете.value
свойства входа не меняет егоvalue
атрибут в современных браузерах». Я не думал, что это произошло, поэтому я начал использовать его в качестве примера, но когда я начал кодировать пример, штопал если он не обновлялся в Chrome, Firefox, Opera, IE ... - jsbin.com/ahire4 Оказывается, это потому, что я использовалinput[type="button"]
для своего эксперимента. Он не обновляет атрибут наinput[type="text"]
- jsbin.com/ahire4/2 Поговорит о запутанном !! Не только элемент, но и тип этого ...Я думаю, что Тим сказал это хорошо , но давайте сделаем шаг назад:
Элемент DOM - это объект, вещь в памяти. Как и большинство объектов в ООП, у него есть свойства . Он также отдельно имеет карту атрибутов, определенных для элемента (обычно исходящих из разметки, которую браузер считал для создания элемента). Некоторые из свойств элемента получают свои начальные значения из атрибутов с такими же или похожими именами (
value
получает его начальное значение из атрибута «value»;href
получает его начальное значение из атрибута «href», но это не совсем то же самое значение;className
из атрибут "класс"). Другие свойства получают свои начальные значения другими способами: например,parentNode
свойство получает свое значение в зависимости от того, что является его родительским элементом;style
свойство, имеет ли он атрибут «стиль» или нет.Давайте рассмотрим этот якорь на странице по адресу
http://example.com/testing.html
:Некоторое бесплатное искусство ASCII (и оставляющее много вещей):
Обратите внимание, что свойства и атрибуты различны.
Теперь, хотя они отличаются друг от друга, потому что все это эволюционировало, а не разрабатывалось с нуля, ряд свойств записывают обратно в атрибут, из которого они получены, если вы их установите. Но не все это делают, и, как вы можете видеть
href
сверху, отображение не всегда является прямым «передачей значения», иногда требуется интерпретация.Когда я говорю о свойствах как о свойствах объекта, я не говорю абстрактно. Вот некоторый не-JQuery код:
(Эти значения соответствуют большинству браузеров; есть некоторые различия.)
link
Объект является реальной вещью, и вы можете видеть , что есть реальное различие между доступом к собственности на него, и доступе к атрибуту .Как сказал Тим, в подавляющем большинстве случаев мы хотим работать со свойствами. Частично это связано с тем, что их значения (даже их имена) имеют тенденцию быть более согласованными в разных браузерах. В основном мы хотим работать с атрибутами только в том случае, если нет связанных с ним свойств (пользовательских атрибутов) или когда мы знаем, что для этого конкретного атрибута атрибут и свойство не равны 1: 1 (как в случае с
href
«href» выше) ,Стандартные свойства изложены в различных спецификациях DOM:
Эти спецификации имеют отличные индексы, и я рекомендую держать ссылки на них под рукой; Я использую их все время.
Настраиваемые атрибуты будут включать, например, любые
data-xyz
атрибуты, которые вы можете добавить к элементам для предоставления метаданных в свой код (теперь это действительно с HTML5, если вы придерживаетесьdata-
префикса). (Последние версии jQuery предоставляют вам доступ кdata-xyz
элементам черезdata
функцию, но эта функция - не просто средство доступа кdata-xyz
атрибутам [она делает больше и меньше этого); если вы на самом деле не нуждаетесь в ее функциях, я бы использовалаattr
функцию для взаимодействия сdata-xyz
атрибутом.)attr
Функция используется , чтобы иметь какую - то запутанную логику вокруг получать то , что они думали , что вы хотели, а не в буквальном смысле становятся атрибут. Это смешало понятия. Переезд вprop
иattr
должен был их деконфлировать. Кратко в v1.6.0 JQuery зашел слишком далеко в этом отношении, но функциональность быстро добавляет обратно вattr
обрабатывать общие ситуации , когда люди используют ,attr
когда технически они должны использоватьprop
.источник
.attr('class', 'bla')
работает, как и ожидалось, в 1.7.0 , 1.7.1 и 1.7.2 в Chrome 17, Firefox 11, Opera 11, IE6, IE8, IE9 и Safari 5..data
- он прочитает значение атрибута по умолчанию, если оно присутствует, но если вы напишите ему, он изменит скрытое свойство элемента, а не обновит атрибут.Это изменение было долгое время для jQuery. В течение многих лет они довольствовались функцией с именем,
attr()
которая в основном извлекала свойства DOM, а не результат, который вы ожидаете от имени. Разделениеattr()
иprop()
должно помочь устранить некоторую путаницу между атрибутами HTML и свойствами DOM.$.fn.prop()
захватывает указанное свойство DOM, а$.fn.attr()
захватывает указанный атрибут HTML.Чтобы полностью понять, как они работают, вот расширенное объяснение различия между атрибутами HTML и свойствами DOM:
HTML атрибуты
Синтаксис:
<body onload="foo()">
Цель: позволяет разметке иметь связанные с ней данные для событий, рендеринга и других целей.
Визуализация: атрибут класса показан здесь на теле. Это доступно через следующий код:
Атрибуты возвращаются в виде строки и могут быть несовместимы от браузера к браузеру. Тем не менее, они могут быть жизненно важны в некоторых ситуациях. Как показано выше, в IE 8 Quirks Mode (и ниже) ожидается имя свойства DOM в get / set / removeAttribute вместо имени атрибута. Это одна из многих причин, почему важно знать разницу.
DOM Properties
Синтаксис:
document.body.onload = foo;
Назначение: Предоставляет доступ к свойствам, принадлежащим узлам элемента. Эти свойства похожи на атрибуты, но доступны только через JavaScript. Это важное различие, которое помогает прояснить роль свойств DOM. Обратите внимание, что атрибуты полностью отличаются от свойств , так как это назначение обработчика событий бесполезно и не получит событие (тело не имеет события onload, только атрибут onload).
Визуализация:
Здесь вы увидите список свойств на вкладке «DOM» в Firebug. Это свойства DOM. Вы сразу заметите довольно много из них, так как использовали их раньше, не зная об этом. Их значения - это то, что вы получите через JavaScript.
Документация
пример
HTML:
<textarea id="test" value="foo"></textarea>
JavaScript:
alert($('#test').attr('value'));
В более ранних версиях jQuery это возвращает пустую строку. В 1.6 возвращается правильное значение
foo
.Не глядя на новый код для любой функции, я могу с уверенностью сказать, что путаница больше связана с различием между атрибутами HTML и свойствами DOM, чем с самим кодом. Надеюсь, это прояснило некоторые вещи для вас.
Матф
источник
$.prop()
получает свойства DOM,$.attr()
получает атрибуты HTML. Я пытаюсь преодолеть этот разрыв психологически, чтобы вы могли понять разницу между ними.$('#test').prop('value')
ничего не возвращает? И не.attr('checked')
для флажка? Но раньше? Теперь вам придется изменить это наprop('checked')
? Я не понимаю необходимости этого различия - почему важно различать атрибуты HTML и свойства DOM? Каков общий вариант использования, который сделал это изменение "долгое время вперед" ? Что плохого в том, чтобы абстрагировать различие между этими двумя понятиями, так как их варианты использования в основном пересекаются?value
Это один из наиболее очевидных случаев, посколькуvalue
свойство даст вам текущее значение поля, ноvalue
атрибут даст вам исходное значение, которое было объявлено вvalue="..."
атрибуте, который фактически являетсяdefaultValue
свойством. (Хотя этот конкретный случай снова запутывается ошибками в IE <9.)attr('value', ...)
в jQuery <1.6 устанавливает свойство, поэтому текущее значение изменяется, а значение по умолчанию - нет. В 1.6 он устанавливает атрибут, поэтому теоретически значение по умолчанию изменяется, а текущее значение - нет. Однако есть (еще) несоответствия браузера в том, что именноvalue
делает атрибут. В IE он также устанавливает текущее значение; в некоторых браузерах он устанавливает текущее значение, только если текущее значение еще не было установлено ранее. [плачет]Свойство находится в DOM; атрибут находится в HTML, который анализируется в DOM.
Дальнейшие детали
Если вы измените атрибут, это изменение будет отражено в DOM (иногда с другим именем).
Пример: изменение
class
атрибута тега изменитclassName
свойство этого тега в DOM. Если у вас нет атрибута для тега, у вас все еще есть соответствующее свойство DOM с пустым значением или значением по умолчанию.Пример: хотя у вашего тега нет
class
атрибута, свойство DOMclassName
существует с пустым строковым значением.редактировать
Если вы измените один, другой будет изменен контроллером, и наоборот. Этот контроллер находится не в jQuery, а в собственном коде браузера.
источник
jQuery('p').prop('className', 'foo');
консоли Chrome, и вы увидите, как каждый абзац получаетclass
атрибут thg'foo'
. Конечно, нет в исходном коде, который приходит с сервера. Это константа.Это просто различие между атрибутами HTML и объектами DOM, которое вызывает путаницу. Для тех, кому удобно работать с нативными свойствами элементов DOM, таких как и
this.src
this.value
this.checked
т. Д.,.prop
Это очень теплый прием в семье. Для других это просто дополнительный слой путаницы. Давайте проясним это.Самый простой способ увидеть разницу между
.attr
и.prop
это следующий пример:$('input').attr('blah')
: возвращается,'hello'
как и ожидалось. Здесь нет сюрпризов.$('input').prop('blah')
: возвращаетundefined
- потому что пытается это сделать[HTMLInputElement].blah
- и такого свойства для этого объекта DOM не существует. Он существует только в области видимости как атрибут этого элемента, т.е.[HTMLInputElement].getAttribute('blah')
Теперь мы изменим несколько вещей так:
$('input').attr('blah')
: возвращает'apple'
а? Почему бы не "груша", как это было установлено последним на этом элементе. Поскольку свойство было изменено для входного атрибута, а не для самого входного элемента DOM - они практически работают независимо друг от друга.$('input').prop('blah')
: возвращается'pear'
То, с чем вам действительно нужно быть осторожным, это просто не смешивать их использование для одного и того же свойства в вашем приложении по вышеуказанной причине.
Смотрите скрипку, демонстрирующую разницу: http://jsfiddle.net/garreh/uLQXc/
.attr
против.prop
:Раунд 1: стиль
.attr('style')
- возвращает встроенные стили для соответствующего элемента, т.е."font:arial;"
.prop('style')
- возвращает объект объявления стиля, т.е.CSSStyleDeclaration
Раунд 2: ценность
.attr('value')
- возвращает'hello'
*.prop('value')
- возвращает'i changed the value'
* Примечание: по этой причине в jQuery есть
.val()
метод, который внутренне эквивалентен.prop('value')
источник
TL; DR
Использование
prop()
болееattr()
в большинстве случаев.Свойство представляет текущее состояние входного элемента. Атрибут является значением по умолчанию.
Свойство может содержать вещи разных типов. Атрибут может содержать только строки
источник
prop() and when to go for attr()
. жду ответа :)Грязная проверка
Эта концепция предоставляет пример, где разница заметна: http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty
Попробуйте это:
prop
флажок был проверен. BANG!Для некоторых атрибутов, таких как
disabled
onbutton
, добавление или удаление атрибута содержимогоdisabled="disabled"
всегда переключает свойство (называемое атрибутом IDL в HTML5), потому что http://www.w3.org/TR/html5/forms.html#attr-fe-disabled говорит:так что вам может это сойти с рук, хотя это уродливо, поскольку он без необходимости модифицирует HTML.
Что касается других атрибутов, таких как
checked="checked"
oninput type="checkbox"
, то они ломаются, потому что, когда вы щелкаете по нему, он становится грязным, а затем добавление или удалениеchecked="checked"
атрибута содержимого больше не переключает checkness .Вот почему вы должны использовать в основном
.prop
, так как это напрямую влияет на эффективное свойство, а не полагаться на сложные побочные эффекты изменения HTML.источник
checked
атрибуту атрибут:checked="checked"
Все в док :
Так что используйте опору!
источник
$.attr()
восстанавливая свойства большую часть времени я работал с ним, а не «иногда». Путаница, вызванная этим, все еще резонансна сегодня. К сожалению, у меня много проблем с поиском окончательного прочтения атрибутов HTML и свойств DOM, поэтому я мог бы написать здесь ответ немного.атрибуты находятся в вашем текстовом документе / файле HTML (== представьте, что это результат анализа вашей разметки html), тогда как
свойства находятся в дереве DOM HTML (== в основном это фактическое свойство некоторого объекта в смысле JS).
Важно отметить, что многие из них синхронизируются (если вы обновите
class
свойство,class
атрибут в html также будет обновлен; и в противном случае). Но некоторые атрибуты могут быть синхронизированы с неожиданными свойствами - например, атрибутchecked
соответствует свойствуdefaultChecked
, так что.prop('checked')
значение, но не изменится.attr('checked')
и.prop('defaultChecked')
значения$('#input').prop('defaultChecked', true)
также изменится.attr('checked')
, но это не будет видно на элементе.И вот таблица, которая показывает, где
.prop()
предпочтительнее (хотя.attr()
все еще может использоваться).Почему вы иногда хотите использовать .prop () вместо .attr (), где это официально рекомендовано?
.prop()
может вернуть любой тип - string, integer, boolean; while.attr()
всегда возвращает строку..prop()
Говорят, что примерно в 2,5 раза быстрее, чем.attr()
.источник
$('#myImageId').prop('src', 'http://example.com/img.png')
,var class = $('.myDivClass').prop('class')
или$('#myTextBox').prop('type', 'button')
. И так далее ....prop()
прекрасно работает со всеми свойствами. Вы не хотите пометить все свойства в.prop()
столбце, не так ли?.prop()
предпочтительнее (хотя.attr()
все еще может использоваться)».attr()
для определения события то, что.prop()
не может. Как это:$('.myDiv').attr('onclick', 'alert("Hello world!")')
. Если вы измените.attr()
на.prop()
, это не будет работать. В целом, я думаю, что нет причин использовать.attr()
для установки или получения значенияid/class/href/checked/src.....
. Обратите внимание, что я не говорю, что вы не правы..attr()
:.prop()
:источник
Обычно вы хотите использовать свойства. Используйте атрибуты только для:
<input value="abc">.
источник
attributes
-> HTMLproperties
-> ДОМисточник
attirbutes
также одна из собственностиDOM
До jQuery 1.6
attr()
метод иногда учитывал значения свойств при получении атрибутов, что вызывало довольно противоречивое поведение.Введение в
prop()
метод обеспечивает способ явного получения значений свойств при.attr()
извлечении атрибутов.Документы:
jQuery.attr()
Получить значение атрибута для первого элемента в наборе соответствующих элементов.jQuery.prop()
Получить значение свойства для первого элемента в наборе соответствующих элементов.источник
Осторожно напоминание об использовании
prop()
, пример:Вышеуказанная функция используется для проверки, установлен флажок 1 или нет, если установлен флажок: return 1; если нет: вернуть 0. Функция prop () используется здесь как функция GET.
Вышеприведенная функция используется для установки флажка 1 для проверки и ВСЕГДА возврата 1. Теперь функция prop () используется в качестве функции SET.
Не путайся
P / S: когда я проверяю свойство Image src . Если src пуст, prop возвращает текущий URL страницы (неверно), а attr возвращает пустую строку (справа).
источник
<img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))">
. Должно сработать и вернуть местоположение изображения.Одна вещь, которая
.attr()
может сделать это,.prop()
не может: повлиять на селекторы CSSВот проблема, которую я не видел в других ответах.
CSS селектор
[name=value]
.attr('name', 'value')
.prop('name', 'value')
.prop()
влияет только на несколько селекторов атрибутовinput[name]
(спасибо @TimDown ).attr()
влияет на все атрибуты-селекторыinput[value]
input[naame]
span[name]
input[data-custom-attribute]
(ни один не.data('custom-attribute')
повлияет на этот селектор)источник
В основном мы хотим использовать объект DOM, а не пользовательский атрибут вроде
data-img, data-xyz
.Также есть некоторые различия при доступе к
checkbox
значению иhref
сattr()
иprop()
как что-то меняется с выходом DOM сprop()
полной ссылкой отorigin
иBoolean
значение для флажка(pre-1.6)
Мы можем получить доступ только к элементам DOM с
prop
другими, тогда это даетundefined
Показать фрагмент кода
источник
Есть еще несколько соображений в prop () против attr ():
selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked и defaultSelected..etc должны быть получены и установлены с помощью метода .prop (). Они не имеют соответствующих атрибутов и являются только свойствами.
Для типа ввода флажок
Метод prop возвращает логическое значение для check, selected, disabled, readOnly..etc, а attr возвращает определенную строку. Таким образом, вы можете напрямую использовать .prop ('флажок') в условии if.
.attr () вызывает .prop () внутри, поэтому метод .attr () будет немного медленнее, чем прямой доступ к ним через .prop ().
источник
Ответ Гэри Хоула очень важен для решения проблемы, если код написан таким образом
Поскольку функция prop возвращает
CSSStyleDeclaration
объект, приведенный выше код не будет работать должным образом в некоторых браузерах (провереноIE8 with Chrome Frame Plugin
в моем случае).Таким образом, изменив его в следующий код
решил проблему.
источник