Чим відрізняються властивості та атрибути в HTML?


407

Після змін, внесених у jQuery 1.6.1, я намагався визначити різницю між властивостями та атрибутами в HTML.

Переглядаючи список приміток до випуску jQuery 1.6.1 (біля нижньої частини), здається, що можна класифікувати властивості та атрибути HTML таким чином:

  • Властивості: все, що має або булеве значення, або розраховане UA, наприклад, вибранийIndex.

  • Атрибути: "Атрибути", які можна додати до елемента HTML, який не є булевим і не містить значення, створене UA.

Думки?


6
Можливий дублікат .prop () vs .attr ()
Naftali aka Neal

Відповіді:


825

Під час написання вихідного коду HTML ви можете визначати атрибути для своїх елементів HTML. Потім, як тільки браузер розбере ваш код, буде створений відповідний вузол DOM. Цей вузол є об'єктом, і тому він має властивості .

Наприклад, цей елемент HTML:

<input type="text" value="Name:">

має 2 атрибути ( typeі value).

Після того, як браузер аналізує цей код, буде створений об’єкт HTMLInputElement , і цей об’єкт буде містити десятки властивостей, таких як: accept, accessKey, align, alt, атрибути, автофокус, baseURI, перевірено, childElementCount, childNodes, діти, classList, className, висота клієнта тощо.

Для даного об’єкта вузла DOM властивості - це властивості цього об'єкта, а атрибути - елементи attributesвластивості цього об'єкта.

Коли для даного елемента HTML створюється вузол DOM, багато його властивостей відносяться до атрибутів з однаковими або подібними іменами, але це не відношення один на один. Наприклад, для цього елемента HTML:

<input id="the-input" type="text" value="Name:">

відповідний DOM - вузол буде мати id, typeі valueвластивість (серед інших):

  • idВластивість відображено властивість для idатрибута: Отримання властивості зчитує значення атрибута, і встановивши властивість записує значення атрибута. idє чистою відображеною властивістю, вона не змінює і не обмежує значення.

  • typeВластивість відображено властивість для typeатрибута: Отримання властивості зчитує значення атрибута, і встановивши властивість записує значення атрибута. typeне є чисто відображеною властивістю, оскільки вона обмежена відомими значеннями (наприклад, дійсними типами вводу). Якщо ти мав <input type="foo">, то theInput.getAttribute("type")дає, "foo"але theInput.typeдає тобі "text".

  • Навпаки, valueвластивість не відображає valueатрибут. Натомість це поточне значення вводу. Коли користувач вручну змінює значення поля введення, valueвластивість відображатиме цю зміну. Отже, якщо користувач вводить "John"у поле введення, тоді:

    theInput.value // returns "John"

    тоді як:

    theInput.getAttribute('value') // returns "Name:"

    valueВластивість відображає поточне текстове вміст всередині-поле введення, в той час як valueатрибут містить початковий текст-вміст valueатрибута з вихідного HTML - коду.

    Тож якщо ви хочете знати, що зараз знаходиться у текстовому полі, прочитайте властивість. Якщо ви хочете знати, яким було початкове значення текстового поля, прочитайте атрибут. Або ви можете скористатися defaultValueвластивістю, яке є чистим відображенням valueатрибута:

    theInput.value                 // returns "John"
    theInput.getAttribute('value') // returns "Name:"
    theInput.defaultValue          // returns "Name:"

Є кілька властивостей , які безпосередньо відображають їх атрибут ( rel, id), деякі з них прямі відображень з злегка різними іменами ( htmlForвідображає forатрибут, classNameвідображає classатрибут), багато з яких відображають їх атрибут , але з обмеженнями / модифікаціями ( src, href, disabled, multiple), і т.д. на. Специфікація охоплює різні види роздумів.


1
Гей, Симе, я здогадуюсь, що це досить неоднозначно, особливо якщо ти тут заглянеш: Здравствуйте , Симе , w3.org/TR/html4/index/attributes.html , і немає чіткої відповіді. В основному потрібно дотримуватися того, що зазначено в резюме в блозі jQuery, і навіть тоді, той буде відображатись на інший і працювати в обох випадках з невеликим ударом, якщо ви неправильно використовуєте опору, коли вам потрібно використовувати attr
schalkneethling

4
@oss Ваше посилання посилається на перелік атрибутів HTML. Цей список неоднозначний - це атрибути.
Šime Vidas

чи є якісь документи про відношення? @ ŠimeVidas
SKing7

3
Де я міг знайти повний перелік атрибутів властивостям (наприклад for-> htmlFor) і аналогічно перелік властивостей, які приймають початкове значення з атрибута, але не відображають його ( input.value). Я очікую, що це буде десь у джерелі бібліотеки github.com/Matt-Esch/virtual-dom, але це насправді не зафіксовано.
sstur

1
@Pim Я сам цього не читав, але ця серія статей у 4 частини здається чудовим ресурсом: twitter.com/addyosmani/status/1082177515618295808
Šime

53

Прочитавши відповідь Симе Відаса , я шукав більше і знайшов дуже прямолінійне і зрозуміле пояснення у кутових документах .

Атрибут HTML та властивість DOM


Атрибути визначаються HTML. Властивості визначаються DOM (Document Object Model).

  • Кілька атрибутів HTML мають відображення у властивостях 1: 1. idє одним із прикладів.

  • Деякі атрибути HTML не мають відповідних властивостей. colspanє одним із прикладів.

  • Деякі властивості DOM не мають відповідних атрибутів. textContent є одним із прикладів.

  • Здається, багато атрибутів HTML відображають властивості ..., але не так, як ви могли подумати!

Ця остання категорія заплутана, поки ви не зрозумієте це загальне правило:

Атрибути ініціалізують властивості DOM, після чого вони виконуються. Значення властивостей можуть змінюватися; значення атрибутів не можуть.

Наприклад, коли браузер відображається <input type="text" value="Bob"> , він створює відповідний вузол DOM із valueвластивістю, ініціалізованим на "Bob".

Коли користувач вводить "Sally" у поле введення, value властивість елемента DOM стає "Sally". Але атрибут HTMLvalue залишається незмінним, коли ви виявите, якщо запитаєте вхідний елемент про цей атрибут: input.getAttribute('value')повертає "Bob".

Атрибут HTML valueвказує початкове значення; value властивість DOM - поточна значення.


disabledАтрибут є ще одним своєрідним прикладом. disabledВластивість кнопки falseза замовчуванням, тому кнопка увімкнена. Коли ви додаєте disabledатрибут, його наявність лише ініціалізує кнопкуdisabled властивість щоб trueкнопка була відключена.

Додавання та видалення disabled атрибута вимикає та вмикає кнопку. Значення атрибута не має значення, тому ви не можете ввімкнути кнопку, записавши<button disabled="false">Still Disabled</button>.

Встановлення disabled властивості кнопки вимикає або вмикає кнопку. Вартість майна має значення.

Атрибут HTML та властивість DOM - це не одне і те ж, навіть якщо вони мають однакове ім'я.


Цей приклад неправильний: colspanатрибут має colSpanвластивість. ... Отже, який атрибут не має пов'язаного властивості зараз?
Роберт Сімер

46

Відповіді вже пояснюють, як атрибути та властивості по-різному обробляються, але я дуже хотів би зазначити, як цілком божевільно . Навіть якщо це до певної міри специфікація.

Божевільно - мати деякі з атрибутів (наприклад, id, class, foo, bar ), щоб зберегти лише один вид значення в DOM, тоді як деякі атрибути (наприклад, перевірені, вибрані ) зберігають два значення; тобто значення "при його завантаженні" та значення "динамічного стану". (Чи не слід, щоб DOM представляв стан документа в повній мірі?)

Абсолютно важливо, щоб два поля введення , наприклад, текст і прапорець, поводилися однаково . Якщо поле для введення тексту не зберігає окреме значення "під час завантаження" та значення "поточне, динамічне", чому це встановлено? Якщо прапорець має два значення для позначеного атрибута, чому він не має двох для атрибутів класу та id ? Якщо ви розраховуєте змінити значення тексту * введення * поля, і ви очікуєте, що DOM (тобто "серіалізоване представлення") зміниться, і відобразить цю зміну, чому на землі ви б не очікували того ж з поля введення введіть прапорець на перевіреному атрибуті?

Диференціація "це булевий атрибут" просто не має для мене ніякого сенсу, або є, принаймні, недостатньою причиною для цього.


21
Це не відповідь, але я з вами згоден; це абсолютно божевільно.
Самуїл

Так, ця концепція відстійна і не повинна бути стандартизована так погано. Це був один із випадків (наприклад, внутрішній HTMLML), який був хорошим у старому IE і повинен був бути прийнятий стандартами. Властивості та атрибути були синхронізовані, де це було можливо, навіть спеціальні атрибути, що робило дуже приємним для читання синтаксис js dot. HTML5 робить власні HTML-теги громадянами першого класу, також повинні бути атрибути. Ця функція видаляється, оскільки старий IE все ще залишається справжньою проблемою - ми лише зараз бачимо, що багато корпорацій, які традиційно застрягли з IE для старих систем, тепер виявляють їх порушеними в IE10.
Майк Нельсон

48
Це не божевільно. Ви неправильно зрозуміли. checkedАтрибут представлений defaultCheckedвластивість (аналогічно для введення тексту , заданий valueатрибут , представлене defaultValueвластивістю). Друге властивість, checkedпотрібно подати, чи встановлено прапорець, тому що це невід'ємна частина функціональної функції прапорця: вона є інтерактивною і може бути змінена (і скинути її за замовчуванням, якщо є кнопка скидання форми користувачем). , таким чином, що іншого атрибута, такого як idні, немає. Це не має нічого спільного з тим, що це бульний атрибут.
Тім Даун

3
@TimDown - Дякую Це насправді мене за WTF? горб
pedz

12
@TimDown Я все ще вважаю, що це "божевільно", тому що будь-який логічний підхід дозволить зіставити ім'я властивості та ім'я атрибута, або, принаймні, не матиме ім'я атрибута та відповідності імені властивості, які не пов'язані (тобто перевірений атрибут відноситься до defaultChecked властивості, поки перевірене властивість не пов'язане). Насправді, логічним підходом, який припускають усі, є справа на початку, було б взагалі не розділяти атрибути та властивості. Атрибути не повинні бути незмінними, але завжди повинні відображати значення властивостей. Не повинно бути різниці між ними.
Даллін

10

ну вони визначаються w3c, що є атрибутом, а що є властивістю http://www.w3.org/TR/SVGTiny12/attributeTable.html

але в даний час attr і prop не такі різні, і вони майже однакові

але вони вважають за краще підтримувати деякі речі

Підсумок кращого використання

Метод .prop () слід використовувати для булевих атрибутів / властивостей та для властивостей, які не існують у html (наприклад, window.location). Усі інші атрибути (ті, які ви можете побачити в html) можуть і повинні продовжувати маніпулювати методом .attr ().

ну насправді вам не потрібно щось змінювати, якщо ви використовуєте attr або prop або обидва, і те, і інше працює, але я бачив, що в моєму додатку проп працював там, де atrr не став, тому я взяв у моєму додатку 1.6 додаток =)


Гей, Даніеле, я це прочитав. Просто здається, що існує чітке визначення чіткості для розділення обох, оскільки деякі з тих, що згадує Sime нижче, також можуть бути додані до елемента HTML, наприклад alt. Продовжую читати деякі специфікації HTML і перевіряти, чи дійсно існує спосіб чітко розрізнити ці два на практиці.
шалькелінг

3
Цей документ стосується SVG, а не HTML.
Лузадо

5

Відмінність властивостей та атрибутів HTML:

Давайте спочатку розглянемо визначення цих слів, перш ніж оцінювати, у чому різниця в HTML:

Англійське визначення:

  • Атрибути посилаються на додаткову інформацію про об'єкт.
  • Властивості описують характеристики об'єкта.

У контексті HTML:

Коли браузер розбирає HTML, він створює структуру даних дерева, яка в основному являє собою пам'ять HTML. Це структура даних дерева містить вузли, які є елементами HTML та текстом. Атрибути та властивості відносяться до цього наступним чином:

  • Атрибути - це додаткова інформація, яку ми можемо помістити у HTML для ініціалізації певних властивостей DOM.
  • Властивості формуються, коли браузер розбирає HTML і генерує DOM. Кожен з елементів у DOM має власний набір властивостей, які встановлює браузер. Деякі з цих властивостей можуть мати своє початкове значення, встановлене атрибутами HTML. Щоразу, коли змінюється властивість DOM, яка впливає на відображену сторінку, сторінка буде негайно виведена

Важливо також усвідомити, що відображення цих властивостей не від 1 до 1. Іншими словами, не кожен атрибут, який ми надаємо в елементі HTML, матиме подібне властивість DOM.

Крім того, мають різні елементи DOM різних властивостей. Наприклад, <input>елемент має властивість значення, якої немає у <div>властивості.

Приклад:

Візьмемо наступний HTML-документ:

 <!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">  <!-- charset is a attribute -->
  <meta name="viewport" content="width=device-width"> <!-- name and content are attributes -->
  <title>JS Bin</title>
</head>
<body>
<div id="foo" class="bar foobar">hi</div> <!-- id and class are attributes -->
</body>
</html>

Потім ми перевіряємо на <div>консолі JS:

 console.dir(document.getElementById('foo'));

Ми бачимо такі властивості DOM (хромовані devtools, не всі властивості показані):

властивості та атрибути html

  • Ми можемо бачити, що ідентифікатор атрибута в HTML тепер є також властивістю ідентифікатора в DOM. Ідентифікатор ініціалізований HTML (хоча ми могли змінити його за допомогою JavaScript).
  • Ми можемо бачити, що атрибут класу в HTML не має відповідного властивості класу ( classзарезервоване ключове слово в JS). Але насправді 2 властивості, classListі className.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.