Я думаю, що Тім сказав це досить добре , але давайте відступимо:
Елемент DOM - це об'єкт, річ у пам'яті. Як і більшість об'єктів в OOP, він має властивості . Окремо він також має карту атрибутів, визначених на елементі (як правило, виходячи з розмітки, яку читав браузер для створення елемента). Деякі властивості елемента отримують свої початкові значення з атрибутів з однаковими або подібними іменами ( value
отримує початкове значення з атрибута "value"; href
отримує своє початкове значення з атрибута "href", але це не зовсім те саме значення; className
від атрибут "class"). Інші властивості отримують свої початкові значення іншими способами: Наприклад, parentNode
властивість отримує своє значення на основі того, що є його батьківським елементом;style
властивість, незалежно від того, має атрибут "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" |
| ім'я: "fooAnchor" |
| id: "fooAnchor" |
| className: "перевірити один" |
| атрибути: |
| href: "foo.html" |
| ім'я: "fooAnchor" |
| id: "fooAnchor" |
| клас: "тест один" |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− + +
Зауважте, що властивості та атрибути відрізняються.
Тепер, хоча вони є різними, оскільки все це розвивалося, а не проектувалося з нуля, ряд властивостей списується до атрибуту, який вони отримали, якщо ви їх встановили. Але це не все, і як видно 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
.