.prop () против .attr ()

2248

Итак 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?

UPDATE

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="/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>

(см. также эту скрипту: http://jsfiddle.net/maniator/JpUF2/)

Консоль регистрирует getAttribute как строку, а attr - как строку, но prop как CSSStyleDeclaration, почему? И как это повлияет на мою кодировку в будущем?

  • 16
    Это будет представлять определенный интерес: books.google.ca/…
  • 26
    @ Нил, потому что это изменение выходит за рамки jQuery. Разница между атрибутами HTML и свойствами DOM огромна.
Показать ещё 14 комментариев
Теги:
dom
attr
prop

18 ответов

1879
Лучший ответ

Обновление 1 ноября 2012 г.

Мой первоначальный ответ относится конкретно к jQuery 1.6. Мой совет остается тем же, но jQuery 1.6.1 немного изменил ситуацию: перед лицом предсказанной кучи сломанных веб-сайтов команда jQuery вернула attr() к чему-то близкому (но не совсем точно так же) своему старому поведению для логических атрибутов, Джон Ресиг также сообщил об этом в блоге. Я вижу трудности, с которыми они столкнулись, но по-прежнему не согласен с его рекомендацией предпочесть attr().

Оригинальный ответ

Если вы только когда-либо использовали jQuery, а не DOM напрямую, это может быть запутанным изменением, хотя это, безусловно, концептуально улучшается. Не так хорошо для bazillions сайтов, использующих jQuery, которые сломаются в результате этого изменения.

Я подведу основные вопросы:

  • Обычно вам нужен prop() а не attr().
  • В большинстве случаев prop() делает то, что раньше делал attr(). Замена вызовов attr() с помощью prop() в вашем коде, как правило, будет работать.
  • Свойства обычно проще иметь дело с атрибутами. Значение атрибута может быть только строкой, тогда как свойство может быть любого типа. Например, checked свойство является логическим, свойство style - это объект с индивидуальными свойствами для каждого стиля, свойство size - это число.
  • Там, где существует свойство и атрибут с тем же именем, обычно обновление одного будет обновлять другое, но это не относится к некоторым атрибутам входных данных, таким как value и checked: для этих атрибутов свойство всегда представляет текущее состояние в то время как атрибут (за исключением старых версий IE) соответствует значению/проверке ввода по умолчанию (отражается в defaultValue/defaultChecked).
  • Это изменение удаляет некоторый слой волшебного jQuery, застрявшего перед атрибутами и свойствами, что означает, что разработчикам jQuery придется немного узнать о различии между свойствами и атрибутами. Это хорошая вещь.

Если вы разработчик jQuery и путаетесь в этом бизнесе по свойствам и атрибутам, вам нужно сделать шаг назад и немного узнать об этом, поскольку jQuery больше не пытается так сильно защитить вас от этого материала. Для авторитетного, но несколько сущего слова по этому вопросу есть спецификации: DOM4, HTML DOM, DOM Level 2, DOM Level 3. Документация DOM для Mozilla действительна для большинства современных браузеров и ее легче читать, чем спецификации, поэтому вы можете найти их справочную информацию DOM. Там раздел о свойствах элемента.

В качестве примера того, как свойства проще обрабатывать, чем атрибуты, рассмотрите флажок, который был первоначально проверен. Вот две возможные части допустимого HTML:

<input id="cb" type="checkbox" checked>
<input id="cb" type="checkbox" checked="checked">

Итак, как вы узнаете, установлен ли флажок с помощью jQuery? Посмотрите на переполнение стека, и вы обычно найдете следующие предложения:

  • if ( $("#cb").attr("checked") === true ) {...}
  • if ( $("#cb").attr("checked") == "checked" ) {...}
  • if ( $("#cb").is(":checked") ) {...}

На самом деле это самая простая вещь в мире, которая связана с checked Boolean свойством, которое существовало и работало безупречно в каждом главном браузере с возможностью просмотра с 1995 года:

if (document.getElementById("cb").checked) {...}

Свойство также делает проверку или снятие флажка тривиальной:

document.getElementById("cb").checked = false

В jQuery 1.6 это однозначно становится

$("#cb").prop("checked", false)

Идея использования checked атрибута для сценария флажка бесполезна и не нужна. Имущество - это то, что вам нужно.

  • Неясно, какой правильный способ проверить или снять флажок с помощью checked атрибута
  • Значение атрибута отражает значение по умолчанию, а не текущее видимое состояние (за исключением некоторых старых версий IE, что делает вещи еще сложнее). Атрибут ничего не сообщает о том, установлен ли флажок на странице. См. Http://jsfiddle.net/VktA6/49/.
  • 0
    Так что, если я хочу обновить, я должен вернуться и изменить все ссылки attr на prop ?
  • 0
    @Neal: Да, я подозреваю, что это сработает в большинстве случаев, хотя, не изучив каждую часть кода attr() и prop() jQuery, я не могу гарантировать, что он будет работать в каждом отдельном случае.
Показать ещё 33 комментария
639

Я думаю, Тим сказал это довольно хорошо, но пусть отступит:

Элемент DOM - это объект, предмет в памяти. Как и большинство объектов в ООП, у него есть свойства. Он также, отдельно, имеет карту атрибутов, определенных на элементе (обычно это происходит из разметки, которую браузер читает для создания элемента). Некоторые из свойств элемента получают свои начальные значения из атрибутов с одинаковыми или похожими именами (value получает свое начальное значение из атрибута "значение"; href получает свое начальное значение из атрибута "href", но это не совсем то же значение; className из атрибута "class" ). Другие свойства получают свои начальные значения другими способами: например, свойство parentNode получает свое значение, основанное на его родительском элементе; элемент всегда имеет свойство style, имеет ли он атрибут "стиль" или нет.

Рассмотрим этот якорь на странице в http://example.com/testing.html:

<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>

Некоторое безвозмездное ASCII-искусство (и оставляющее много вещей):

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
|             HTMLAnchorElement             |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| href:       "http://example.com/foo.html" |
| name:       "fooAnchor"                   |
| id:         "fooAnchor"                   |
| className:  "test one"                    |
| attributes:                               |
|    href:  "foo.html"                      |
|    name:  "fooAnchor"                     |
|    id:    "fooAnchor"                     |
|    class: "test one"                      |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+

Обратите внимание, что свойства и атрибуты различны.

Теперь, хотя они различны, поскольку все это развивается, а не разрабатывается с нуля, ряд свойств записывается обратно в атрибут, из которого они получены, если вы их установили. Но не все это делают, и, как вы можете видеть из href выше, отображение не всегда является прямым "передать значение", иногда используется интерпретация.

Когда я говорю о свойствах, являющихся свойствами объекта, я не говорю абстрактно. Здесь некоторый код не-jQuery:

var link = document.getElementById('fooAnchor');
alert(link.href);                 // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"

(Эти значения соответствуют большинству браузеров, есть некоторые варианты.)

Объект 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.

  • 0
    Вот это да. это новое обновление 1.6.1 действительно сводит на нет этот вопрос немного ... (но не очень), но эта ссылка в основном отвечает на него сейчас
  • 0
    Это не аннулировало его для меня, я просто исправил ошибку, используя jquery1.7, где я устанавливал .attr ('class', 'bla'), и он не работал где .prop ('className', 'bla' ) работал
Показать ещё 12 комментариев
254

Это изменение уже давно наступило для jQuery. В течение многих лет они были довольны функцией с именем attr() которая в основном извлекала свойства DOM, а не результат, который вы ожидаете от имени. Сегрегация attr() и prop() должна помочь смягчить некоторую путаницу между атрибутами HTML и свойствами DOM. $.fn.prop() захватывает указанное свойство DOM, а $.fn.attr() захватывает указанный атрибут HTML.

Чтобы полностью понять, как они работают, вот расширенное объяснение различий между атрибутами HTML и свойствами DOM.

Атрибуты HTML

Синтаксис:

<body onload="foo()">

Назначение: позволяет разметке иметь связанные с ней данные для событий, рендеринга и других целей.

Визуализация: Изображение 2055 Атрибут класса показан здесь на теле. Он доступен через следующий код:

var attr;
attr = document.body.getAttribute("class");
//IE 8 Quirks and below
attr = document.body.getAttribute("className");

Атрибуты возвращаются в виде строки и могут быть непоследовательными от браузера к браузеру. Однако они могут быть жизненно важными в некоторых ситуациях. Как показано выше, IE Quirks Mode (и ниже) ожидает имя свойства DOM в get/set/removeAttribute вместо имени атрибута. Это одна из многих причин, почему важно знать разницу.

Свойства DOM

Синтаксис:

document.body.onload = foo;

Назначение: дает доступ к свойствам, принадлежащим узлам элементов. Эти свойства похожи на атрибуты, но доступны только через JavaScript. Это важное различие, которое помогает выяснить роль свойств DOM. Обратите внимание, что атрибуты полностью отличаются от свойств, поскольку это назначение обработчика событий бесполезно и не получит событие (тело не имеет события onload, а только атрибут onload).

Визуализация: Изображение 2056

Здесь вы увидите список свойств на вкладке "DOM" в Firebug. Это свойства DOM. Вы сразу заметите немало из них, поскольку вы будете использовать их раньше, не зная об этом. Их значения - это то, что вы будете получать через JavaScript.

Документация

пример

HTML: <textarea id="test" value="foo"></textarea>

JavaScript: alert($('#test').attr('value'));

В более ранних версиях jQuery это возвращает пустую строку. В 1.6 возвращается правильное значение, foo.

Не взглянув на новый код для любой функции, я могу с уверенностью сказать, что путаница больше связана с различием между атрибутами HTML и свойствами DOM, чем с самим кодом. Надеюсь, это прояснило вам кое-что.

-Matt

  • 2
    @Matt это ничего не объясняет о prop() в jQuery ....
  • 7
    $.prop() получает свойства DOM, $.attr() получает атрибуты HTML. Я пытаюсь преодолеть этот разрыв психологически, чтобы вы могли понять разницу между ними.
Показать ещё 10 комментариев
226

Свойство находится в DOM; атрибут находится в HTML, который анализируется в DOM.

Дополнительная информация

Если вы измените атрибут, это изменение будет отражено в DOM (иногда с другим именем).

Пример: изменение атрибута class тега изменит свойство className этого тега в DOM. Если у вас нет атрибута в теге, у вас все еще есть соответствующее свойство DOM с пустым или значением по умолчанию.

Пример. Хотя ваш тег не имеет атрибута class, свойство DOM className существует с пустым строковым значением.

изменить

Если вы измените одно, другое будет изменено контроллером и наоборот. Этот контроллер не находится в jQuery, но в собственном коде браузера.

  • 0
    Значит ли это, что лучше обновить атрибут, потому что тогда вы гарантируете, что атрибут и свойство будут обновлены и выровнены?
  • 1
    @ Luke DOM - это внутреннее техническое представление, модель. Атрибуты HTML - это внешнее представление, представление. Если вы измените один, другой будет изменен контроллером, и наоборот.
Показать ещё 4 комментария
140

Это просто различие между атрибутами HTML и объектами DOM, вызывающими путаницу. Для тех, кто удобен в отношении свойств свойств DOM, таких как this.src this.value this.checked и т.д., .prop - это очень теплый прием в семье. Для других это просто дополнительный путаница. Пусть это ясно.

Самый простой способ увидеть разницу между .attr и .prop - это следующий пример:

<input blah="hello">
  • $('input').attr('blah'): возвращает 'hello', как ожидалось. Здесь нет сюрпризов.
  • $('input').prop('blah'): возвращает undefined - потому что он пытается сделать [HTMLInputElement].blah - и никакого такого свойства на этом объекте DOM не существует. Он существует только в области как атрибут этого элемента, т.е. [HTMLInputElement].getAttribute('blah')

Теперь мы изменим несколько таких вещей:

$('input').attr('blah', 'apple');
$('input').prop('blah', 'pear');
  • $('input').attr('blah'): возвращает 'apple' eh? Почему бы не "груша", поскольку это было последним для этого элемента. Поскольку свойство было изменено на входном атрибуте, а не на элемент ввода DOM - они в основном почти независимо друг от друга работают.
  • $('input').prop('blah'): возвращает 'pear'

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

См. скрипку, демонстрирующую разницу: http://jsfiddle.net/garreh/uLQXc/


.attr vs .prop:

Раунд 1: стиль

<input style="font:arial;"/>
  • .attr('style') - возвращает встроенные стили для согласованного элемента i.e. "font:arial;"
  • .prop('style') - возвращает объект объявления стиля i.e. CSSStyleDeclaration

Раунд 2: значение

<input value="hello" type="text"/>   

$('input').prop('value', 'i changed the value');
  • .attr('value') - возвращает 'hello' *
  • .prop('value') - возвращает 'i changed the value'

* Примечание: jQuery по этой причине имеет метод .val(), который внутренне эквивалентен .prop('value')

  • 0
    @Neal, потому что это дает ссылку на структуру функций jquery. "$ ('input'). prop ('blah'): возвращает неопределенное значение - потому что он пытается сделать [HTMLInputElement] .blah - и такого свойства для этого объекта DOM не существует. Он существует только в области видимости как атрибут этого элемента, т.е. [HTMLInputElement] .getAttribute ('blah') "
  • 2
    Отличается от doc, api.jquery.com/prop : «Метод .prop () следует использовать для установки отключенного и проверенного вместо метода .attr (). Метод .val () должен использоваться для получения и значение настройки. "
47

TL; DR

Используйте prop() более attr() в большинстве случаев.

Свойство - это текущее состояние элемента ввода. Атрибут - это значение по умолчанию.

Свойство может содержать вещи разных типов. Атрибут может содержать только строки

  • 1
    если возможно, предоставьте несколько простых примеров того, что вы говорите, а также покажите, когда использовать prop() and when to go for attr() . ждет ответа :)
36

Грязная проверка

Эта концепция служит примером, где разница наблюдаема: http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty

Попробуйте:

  • нажмите кнопку. Оба флажка были проверены.
  • снимите оба флажка.
  • нажмите кнопку еще раз. Проверяется только флажок prop. BANG!

$('button').on('click', function() {
  $('#attr').attr('checked', 'checked')
  $('#prop').prop('checked', true)
})
<script src="/jquery.min.js"></script>
<label>attr <input id="attr" type="checkbox"></label>
<label>prop <input id="prop" type="checkbox"></label>
<button type="button">Set checked attr and prop.</button>

Для некоторых атрибутов, таких как disabled на button, добавление или удаление атрибута content disabled="disabled" всегда переключает свойство (называемое атрибутом IDL в HTML5), потому что http://www.w3.org/TR/html5/forms.html#attr -fe-disabled говорит:

Отключенный атрибут IDL должен отражать атрибут отключенного контента.

так что вы можете уйти от него, хотя он уродлив, так как он изменяет HTML без необходимости.

Для других атрибутов, таких как checked="checked" на input type="checkbox", все ломается, потому что как только вы нажимаете на него, он становится грязным, а затем добавление или удаление атрибута checked="checked" не отменяет проверку.

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

  • 0
    Для полноты также попробуйте следующие варианты: 1) Перед нажатием кнопки установите флажок, а затем снимите первый флажок. 2) (Для этого вам нужно будет изменить фрагмент). Присвойте первому входу checked атрибут: checked="checked"
32

Все в док:

Разница между атрибутами и свойствами может быть важна в определенных ситуациях. До версии jQuery 1.6 метод .attr() иногда учитывал значения свойств при извлечении некоторых атрибутов, что могло вызвать противоречивое поведение. Начиная с jQuery 1.6, метод .prop() предоставляет способ явного получения значений свойств, в то время как .attr() возвращает атрибуты.

Так что используйте опору!

  • 2
    Так что это значит, когда я переключаюсь на 1.6, многие вещи сломаются?
  • 0
    Нет, это просто противоречивое поведение, если оно работает раньше, оно всегда будет работать с jQuery 1.6, просто опора безопаснее;)
Показать ещё 5 комментариев
26

атрибуты находятся в вашем текстовом документе/файле HTML (== представьте, что это результат анализа разметки html разметки), тогда как свойства находятся в дереве HTML DOM (== в основном фактическое свойство некоторого объекта в смысле JS).

Важно отметить, что многие из них синхронизированы (если вы обновите свойство class, а атрибут class в html также будет обновлен, а в противном случае). Но некоторые атрибуты могут синхронизироваться с неожиданными свойствами - например, атрибут checked соответствует свойству defaultChecked, поэтому

  • ручная проверка флажка изменит значение .prop('checked'), но не изменит значения .attr('checked') и .prop('defaultChecked')
  • настройка $('#input').prop('defaultChecked', true) также изменит .attr('checked'), но это не будет видно на элементе.

Правило большого пальца: .prop() метод должен использоваться для логических атрибутов/свойств и для свойств, которые не существуют в html (например, window.location). Все остальные атрибуты (которые вы можете видеть в html) можно и должно продолжать манипулировать с помощью .attr()метод. (http://blog.jquery.com/2011/05/10/jquery-1-6-1-rc-1-released/)

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

Изображение 2057


Почему вы иногда хотите использовать .prop() вместо .attr(), где официально официально заявлено последнее?

  • .prop() может возвращать любой тип - string, integer, boolean; а .attr() всегда возвращает строку.
  • .prop() называется примерно в 2,5 раза быстрее, чем .attr().
  • 0
    что-то изменилось, например: $('#myImageId').prop('src', 'http://example.com/img.png') , var class = $('.myDivClass').prop('class') или $('#myTextBox').prop('type', 'button') . И так далее...
  • 0
    @ Мистер Волк, извини, я не понимаю, что ты имеешь в виду. что изменилось'? Синтаксис всегда был таким.
Показать ещё 3 комментария
18

.attr():

  • Получить значение атрибута для первого элемента в наборе согласованных элементов.
  • Дает вам значение элемента, как оно определено в html на загрузке страницы

.prop():

  • Получить значение свойства для первого элемента в наборе согласованных элементов.
  • Дает обновленные значения элементов, которые изменяются с помощью javascript/jquery
13

Обычно вы хотите использовать свойства. Использовать атрибуты только для:

  • Получение пользовательского атрибута HTML (поскольку он не синхронизирован с свойством DOM).
  • Получение атрибута HTML, который не синхронизируется с свойством DOM, например. получить "исходное значение" стандартного атрибута HTML, например <input value="abc">.
7

attributes → HTML

properties → DOM

  • 8
    Я знаю, что вы хотите сказать, но HTML - это язык разметки, а DOM - представление, созданное из HTML. DOMElement имеет как атрибуты, так и свойства .
  • 0
    @ t.niese, attirbutes также является одним из свойств DOM
Показать ещё 1 комментарий
6

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

Введение метода prop() обеспечивает способ явного извлечения значений свойств, тогда как .attr() извлекает атрибуты.

Документы:

jQuery.attr() Получите значение атрибута для первого элемента в наборе согласованных элементов.

jQuery.prop() Получить значение свойства для первого элемента в наборе согласованных элементов.

2

jQuery 1.6 вводит функцию.prop() и разделяет атрибуты и свойства DOM, она поднимает много вопросов о различии между функциями.attr и.prop.

см. ниже примеры:

Пример: 1)

<input id="demo" type="text" dbvalue="Kansagara" />

$("#demo").attr("dbvalue");   // returns Kansagara
$("#demo").prop("dbvalue");   // returns undefined

.prop() возвращает значение только атрибута HTML DOM, он не возвращает значение настраиваемого атрибута, в то время как.attr() также возвращает значение пользовательского атрибута, показанное выше.

Пример: 2)

<input id="demo" type="text" value="Kansagara" />

Теперь я изменил текст "Kansagara" на "Hitesh" в текстовом поле.

$("#demo").attr("value");   // returns Kansagara
$("#demo").prop("value");   // returns Hitesh

Теперь у вас есть идея, что это значит. Изменяется только свойство элементов, поскольку оно находится в DOM и динамическом. Но атрибут элементов находится в тексте HTML и не может быть изменен. В широком смысле свойство всегда представляет текущее состояние, в то время как атрибут (за исключением старых версий IE) представляет начальное состояние или предназначен для атрибутов html, поскольку они строго определены. атрибут ничего не сообщает о текущем состоянии.

для флажка (jquery 1. 6+)

<input id="check1" checked="checked" type="checkbox" />

.attr('checked') //returns  checked
.prop('checked') //returns  true
.is(':checked') //returns true

prop возвращает значение Boolean для отмеченного, выбранного, отключенного, readOnly..etc, в то время как attr возвращает определенную строку. Таким образом, вы можете напрямую использовать.prop('checked) в условии if.

.attr() вызывает.prop() внутри, поэтому метод.attr() будет немного медленнее, чем доступ к ним непосредственно через.prop().

Для jQuery 1. 6+, prop будет использоваться в основном потому, что он прост и шире, чем attr. В большинстве старых проектов attr используется для получения текущей информации о состоянии элемента. Но теперь опора заняла эту работу, и атр будет заменен опорой.

Надеюсь, поможет.

2

Осторожно напоминайте об использовании prop(), например:

if ($("#checkbox1").prop('checked')) {
    isDelete = 1;
} else {
    isDelete = 0;
}

Вышеприведенная функция используется для проверки флажка checkbox1 или нет, если отмечено: return 1; if not: return 0. Функция prop() используется здесь как функция GET.

if ($("#checkbox1").prop('checked', true)) {
    isDelete = 1;
} else {
    isDelete = 0;
}

Вышеуказанная функция используется для установки checkbox1 для проверки и возврата ALWAY 1. Теперь функция prop() используется как функция SET.

Не испортите.

P/S: Когда я проверяю свойство src. Если src пуст, prop возвращает текущий URL-адрес страницы (неверно) и attr возвращает пустую строку (справа). p >

  • 0
    Вы ошибаетесь в этом примере: <img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))"> . Должно сработать и вернуть местоположение изображения.
  • 0
    Если источник пуст
0

.prop()

.prop( propertyName )
propertyName
Type: String
The name of the property to get.

Метод.prop() получает значение свойства только для первого элемента в согласованном наборе. Он возвращает undefined для значения свойства, которое не было задано, или если согласованный набор не имеет элементов. Чтобы получить значение для каждого элемента отдельно, используйте конструкцию цикла, такую как метод jQuery.each() или.map().

<html>
<head>
  <meta charset="utf-8">
  <title>prop demo</title>
  <style>
  p {
    margin: 20px 0 0;
  }
  b {
    color: blue;
  }
  </style>
  <script src="/jquery-1.10.2.js"></script>
</head>
<body>

<input id="check1" type="checkbox" checked="checked">
<label for="check1">Check me</label>
<p></p>

<script>
$( "input" ).change(function() {
  var $input = $( this );
  $( "p" ).html(
    ".attr( \"checked\" ): <b>" + $input.attr( "checked" ) + "</b><br>" +
    ".prop( \"checked\" ): <b>" + $input.prop( "checked" ) + "</b><br>" +
    ".is( \":checked\" ): <b>" + $input.is( ":checked" ) + "</b>" );
}).change();
</script>

</body>
</html>

.attr()

.attr( attributeName )
attributeName
Type: String
The name of the attribute to get.

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

Использование метода jQuery.attr() для получения значения атрибута элемента имеет два основных преимущества:

Удобство: он может быть вызван непосредственно на объект jQuery и привязан к другим методам jQuery. Совместимость между браузерами: значения некоторых атрибутов сообщаются непоследовательно в браузерах и даже в версиях одного браузера. Метод.attr() уменьшает такие несоответствия.

<html>
<head>
  <meta charset="utf-8">
  <title>attr demo</title>
  <style>
  em {
    color: blue;
    font-weight: bold;
  }
  div {
    color: red;
  }
  </style>
  <script src="/jquery-1.10.2.js"></script>
</head>
<body>

<p>Once there was a <em title="huge, gigantic">large</em> dinosaur...</p>

The title of the emphasis is:<div></div>

<script>
var title = $( "em" ).attr( "title" );
$( "div" ).text( title );
</script>

</body>
</html>
0

1) Свойство находится в DOM; атрибут находится в HTML, который анализируется в DOM.

2) $(elem).attr( "checked" ) (1.6.1+) "checked" (String) Будет изменение с состоянием флажка

3) $(elem).attr( "checked" ) (pre-1.6) true (Boolean) Изменено с состоянием флажка

  • В основном мы хотим использовать для объекта DOM вместо пользовательского атрибута например data-img, data-xyz.

  • Также некоторые различия при доступе к значению checkbox и href с attr() и prop() по мере изменения вещи с выходом DOM с prop() в качестве полной ссылки из origin и Boolean значение для флажка (pre-1.6)

  • Мы можем получить доступ только к элементам DOM с помощью prop other, а затем undefined

<script src="/jquery.min.js"></script>
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>prop demo</title>
  <style>
    p {
      margin: 20px 0 0;
    }
    b {
      color: blue;
    }
  </style>

</head>

<body>

  <input id="check1" type="checkbox" checked="checked">
  <label for="check1">Check me</label>
  <p></p>

  <script>
    $("input").change(function() {
      var $input = $(this);
      $("p").html(
        ".attr( \"checked\" ): <b>" + $input.attr("checked") + "</b><br>" +
        ".prop( \"checked\" ): <b>" + $input.prop("checked") + "</b><br>" +
        ".is( \":checked\" ): <b>" + $input.is(":checked")) + "</b>";
    }).change();
  </script>

</body>

</html>
-1

Ответ Gary Hole очень важен для решения проблемы, если код написан таким образом

obj.prop("style","border:1px red solid;")

Так как функция prop возвращает объект CSSStyleDeclaration, код выше не работает должным образом в каком-либо браузере (в моем случае тестируется с IE8 with Chrome Frame Plugin).

Таким образом, изменяя его на следующий код

obj.prop("style").cssText = "border:1px red solid;"

решил проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню