getAttribute () проти властивостей об’єкта Element?


92

Вирази люблять Element.getAttribute("id")і Element.idповертають одне і те ж.

Який з них слід використовувати, коли нам потрібні атрибути об’єкта HTMLElement?

Чи існує якась проблема у переглядачах із цими методами, як getAttribute()і setAttribute()?

Або будь-який вплив на продуктивність між безпосереднім доступом до властивостей об’єкта та використанням цих методів атрибутів?


1
Подібне запитання: Властивості та атрибути в HTML
sleske

Відповіді:


126

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«S checkedвласності. Властивість DOM повертає trueабо, falseпоки атрибут повертає рядок "checked"або порожній рядок.

І тоді, є деякі властивості, які синхронізуються лише в один бік . Найкращий приклад - valueвластивість inputелемента. Зміна його значення за допомогою властивості DOM не призведе до зміни атрибута (редагувати: перевірити перший коментар для більшої точності).

Через ці причини я пропоную продовжувати використовувати властивості DOM , а не атрибути, оскільки їх поведінка відрізняється між браузерами.

Насправді є лише два випадки, коли вам потрібно використовувати атрибути:

  1. Спеціальний атрибут HTML, оскільки він не синхронізується із властивістю DOM.
  2. Щоб отримати доступ до вбудованого в HTML атрибута, яка не синхронізований від власності, і ви впевнені , що вам потрібен атрибут (наприклад, оригінал valueяк inputелемента).

Якщо ви хочете отримати більш детальне пояснення, настійно рекомендую прочитати цю сторінку . Це займе у вас лише кілька хвилин, але ви будете в захваті від інформації (яку я тут підсумував).


9
+1 за загальну хорошу пораду. Що стосується синхронізації, то це незначно: valueвластивість введення отримує початкове значення з атрибута, але в іншому випадку взагалі не пов’язане з ним. Натомість valueатрибут повністю синхронізований із defaultValueвластивістю. Так само checkedі defaultChecked. За винятком старого IE (<= 7 і режими сумісності пізніше), який не працював getAttribute()і setAttribute().
Тім Даун

Додав ваш коментар як "подальше пояснення" :-)
Флоріан Маргайн

2
Я думаю, ви помилилися з першим прикладом. a.hrefповертає повну URL-адресу, a.getAttribute("href")повертає атрибут точно так само, як defiend у джерелі HTML.
Салман,

Якщо ви намагаєтеся з’ясувати, чи не є значення не за замовчуванням, вам краще використовувати атрибути. Багато сучасних браузерів повернуть значення за замовчуванням (наприклад input.formAction) або порожній рядок (наприклад a.download), що робить речі неоднозначними. Єдиним винятком є ​​значення, які не синхронізуються двостороннім способом, наприклад value.
Kevin Li

Якщо ідентифікатор взагалі не встановлений у dom, getAttribute поверне null, а element.id - порожній рядок. Це стандарт?
Maciej Krawczyk

11

getAttribute('attribute') зазвичай повертає значення атрибута як рядок, точно так, як це визначено в HTML-коді сторінки.

Однак element.attributeможе повернути нормоване або обчислене значення атрибута. Приклади:

  • <a href="https://stackoverflow.com/foo"></a>
    • a.href міститиме повну URL-адресу
  • <input type="checkbox" checked>
    • input. selected буде true (логічне значення)
  • <input type="checkbox" checked="bleh">
    • input. selected буде true (логічне значення)
  • <img src='http://dummyimage.com/64x64/000/fff'>
    • img.width буде 0 (число) перед завантаженням зображення
    • img.width буде 64 (число) при завантаженні зображення (або перших кількох байтів)
  • <img src='http://dummyimage.com/64x64/000/fff' width="50%">
    • img.width буде розраховане на 50%
  • <img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
    • імг. ширина буде 50 (число)
  • <div style='background: lime;'></div>
    • div.style буде об'єктом

3

Згідно з цим тест jsPerf getAttribute є більш повільним, ніж idвластивість.

PS

Як не дивно, обидва твердження дуже погано працюють на IE8 (порівняно з іншими браузерами).


3

Завжди використовуйте властивості, якщо у вас немає конкретної причини цього не робити.

  • getAttribute()і setAttribute()порушені в попередній версії IE (і режим сумісності в пізніших версіях)
  • властивості зручніші (зокрема, ті, що відповідають логічним атрибутам)

Є деякі винятки :

  • доступ до атрибутів <form>елементів
  • доступ до користувацьких атрибутів (хоча я б взагалі не рекомендував використовувати власні атрибути)

Я писав про цю тему кілька разів на SO:


До IE 8 властивості та атрибути трактувались однаково . Як ви вже згадували раніше, властивості - це шлях.

@MattMcDonald: Так, це розбитість, на яку я натякав. У цій відповіді я не розширював її, тому що відчував, що зробив достатньо для інших відповідей, на які я посилався :)
Tim Down

3

.idзберігає накладні виклики функції. (що дуже мало, але ви запитали.)


Привіт, gdoron, просто задля цікавості: я намагався знайти „офіційне” пояснення цьому (поза емпіричним тестом, який є досить зрозумілим;)), але безуспішно. Чи є у вас якесь посилання на це?
mamoo

0

Спробуйте нижче приклад, щоб зрозуміти це повністю. Для нижченаведеного DIV

<div class="myclass"></div>

Element.getAttribute('class')Повернуся , myclassале ви повинні використовувати , Element.classNameякий витягує його з властивості DOM.


0

Однією з областей, де це робить велику різницю, є стилі 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 та відповідним чином оформлений.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.