Выражения вроде Element.getAttribute("id")
и Element.id
возвращают одно и то же.
Какой из них следует использовать, когда нам нужны атрибуты объекта HTMLElement?
Есть ли проблема с кроссбраузерностью при использовании таких методов, как getAttribute()
и setAttribute()
?
Или какое-либо влияние на производительность между прямым доступом к свойствам объекта и использованием этих методов атрибутов?
Ответы:
getAttribute
извлекает атрибут элемента DOM, аel.id
извлекает свойство этого элемента DOM. Они не то же самое.В большинстве случаев свойства DOM синхронизируются с атрибутами.
Однако синхронизация не гарантирует того же значения . Классический пример - между якорным элементом
el.href
иel.getAttribute('href')
для него.Например:
<a href="/" id="hey"></a> <script> var a = document.getElementById('hey') a.getAttribute('href') // "/" a.href // Full URL except for IE that keeps '/' </script>
Такое поведение происходит потому, что согласно W3C свойство href должно быть правильно сформированной ссылкой. Большинство браузеров соблюдают этот стандарт (угадайте, кто нет?).
Существует еще один случай для
input
«Schecked
собственности. Свойство DOM возвращаетtrue
или вfalse
то время как атрибут возвращает строку"checked"
или пустую строку.Кроме того, есть некоторые свойства, которые синхронизируются только в одном направлении . Лучший пример -
value
свойствоinput
элемента. Изменение его значения с помощью свойства DOM не изменит атрибут (редактирование: проверьте первый комментарий для большей точности).По этим причинам я бы посоветовал вам продолжать использовать свойства DOM , а не атрибуты, поскольку их поведение различается в разных браузерах.
На самом деле есть только два случая, когда вам нужно использовать атрибуты:
value
в качествеinput
элемента).Если вам нужно более подробное объяснение, я настоятельно рекомендую вам прочитать эту страницу . Это займет у вас всего несколько минут, но вы будете в восторге от информации (которую я здесь резюмировал).
источник
value
свойство входа получает свое начальное значение из атрибута, но в остальном вообще не привязано к нему.value
Атрибут полностью синхронизирован вместо сdefaultValue
собственностью. Точно так жеchecked
иdefaultChecked
. За исключением старого IE (<= 7 и режимы совместимости позже), в котором были сломаныgetAttribute()
иsetAttribute()
.a.href
возвращает полный URL,a.getAttribute("href")
возвращает атрибут точно так же, как defiend в исходном HTML.input.formAction
) или пустую строку (напримерa.download
), что делает ситуацию неоднозначной. Единственным исключением являются значения, которые не синхронизируются с двусторонней синхронизацией, напримерvalue
.getAttribute('attribute')
обычно возвращает значение атрибута в виде строки, точно такой, как определено в исходном HTML-коде страницы.Однако
element.attribute
может возвращать нормализованное или вычисленное значение атрибута. Примеры:<a href="https://stackoverflow.com/foo"></a>
<input type="checkbox" checked>
<input type="checkbox" checked="bleh">
<img src='http://dummyimage.com/64x64/000/fff'>
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
<div style='background: lime;'></div>
источник
Согласно этому тесту jsPerf
getAttribute
медленнее, чемid
свойство.PS
Как ни странно, оба оператора очень плохо работают в IE8 (по сравнению с другими браузерами).
источник
Всегда используйте свойства, если у вас нет особой причины не делать этого.
getAttribute()
и неsetAttribute()
работают в более старом IE (и режиме совместимости в более поздних версиях)Есть некоторые исключения :
<form>
элементовЯ писал на эту тему несколько раз на SO:
источник
.id
экономит накладные расходы на вызов функции. (что очень мало, но вы спросили.)источник
Чтобы полностью понять это, попробуйте приведенный ниже пример. Для нижеприведенного DIV
<div class="myclass"></div>
Он
Element.getAttribute('class')
вернется,myclass
но вы должны использовать,Element.className
который извлекает его из свойства DOM.источник
Одна из областей, где это имеет большое значение, - это стили CSS на основе атрибутов.
Обратите внимание на следующее:
const divs = document.querySelectorAll('div'); divs[1].custom = true; divs[2].setAttribute('custom', true);
div { border: 1px solid; margin-bottom: 8px; } div[custom] { background: #36a; color: #fff; }
<div>A normal div</div> <div>A div with a custom property set directly.</div> <div>A div with a custom attribute set with `setAttribute`</div>
Div с настраиваемым набором свойств напрямую не отражает значение атрибута и не выбирается нашим селектором атрибутов (
div[custom]
) в CSS.Однако div с настраиваемым атрибутом, установленным с помощью
setAttribute
, можно выбрать с помощью селектора атрибутов css и соответствующим образом оформить.источник