getAttribute () против свойств объекта элемента?
выражения типа Element.getAttribute("id") и Element.id вернуться то же самое.
какой из них следует использовать, когда нам нужны атрибуты объекта HTMLElement?
есть ли кросс-браузер проблема с этими методами, как getAttribute() и setAttribute()?
или любое влияние на производительность между прямым доступом к свойствам объекта и использованием этих методов атрибутов?
7 ответов:
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собственность. Возвращает собственность домtrueилиfalseв то время как атрибут возвращает строку"checked"или пустая строка.и потом, есть некоторые свойства, которые синхронизируются в одну сторону только. Лучшим примером является
valueсвойстваinputэлемент. Изменение его значения через свойство DOM не изменит атрибут (изменить: проверьте первый комментарий для большей точности).из-за этих причин, я бы предложил вам продолжать использовать DOM свойства, а не атрибуты, так как их поведение различается между браузерами.
на самом деле, есть только два случая, когда вам нужно использовать атрибуты:
- пользовательский атрибут HTML, поскольку он не синхронизируется со свойством DOM.
- для доступа к встроенному HTML-атрибуту, который не синхронизируется со свойством, и вы уверены, что вам нужен атрибут (например, исходный
valueнаinputэлемент).если вы хотите более подробное объяснение, я настоятельно рекомендую вам прочитать на этой странице. Это займет у вас всего несколько минут, но вы будете в восторге от информация (которую я здесь подытожил).
,
getAttribute('attribute')обычно возвращает значение атрибута в виде строки, точно как определено в HTML-источнике страницы.element.attributeможет возвращать нормализованное или вычисленное значение атрибута. Примеры:
<a href="/foo"></a>
- a. href будет содержать полное URL
<input type="checkbox" checked>
- вход.проверено будет справедливо (логическое)
<input type="checkbox" checked="bleh">
- вход.проверено будет true (boolean)
<img src='http://dummyimage.com/64x64/000/fff'>
- img.ширина будет 0 (число) перед загрузкой изображения
- img.ширина будет 64 (число), когда изображение (или первые несколько байтов из него) загружается
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
- img.ширина будет из расчета 50%
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
- img.ширина будет 50 (количество)
<div style='background: lime;'></div>
- div.стиль будет объектом
по данным этот тест jsPerf
getAttributeмедленнее, чемidсобственность.PS
Как ни странно, оба высказывания очень плохо на IE8 (по сравнению с другими браузерами).
всегда используйте свойства, если у вас нет конкретной причины не делать этого.
getAttribute()иsetAttribute()сломаны в старых IE (и режим совместимости в более поздних версиях)- свойства более удобны (в частности, те, которые соответствуют логическим атрибутам)
здесь исключения:
- доступ к атрибутам
<form>элементов- доступ к пользовательским атрибутам (хотя я бы не рекомендуется использовать пользовательские атрибуты вообще)
я писал об этом предмете несколько раз на SO:
попробуйте ниже пример, чтобы понять это полностью. Для приведенного ниже DIV
<div class="myclass"></div>The
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 селектор, и стиль соответственно.
Comments