В чем разница между свойствами и атрибутами в HTML?


409

После изменений, внесенных в jQuery 1.6.1, я пытался определить разницу между свойствами и атрибутами в HTML.

Глядя на список заметок о выпуске jQuery 1.6.1 (внизу), кажется, что можно классифицировать свойства и атрибуты HTML следующим образом:

  • Свойства: Все, которое имеет логическое значение или рассчитывается UA, например selectedIndex.

  • Атрибуты: «Атрибуты», которые можно добавить к элементу HTML, который не является ни логическим, ни содержащим значение, созданное UA.

Мысли?


Ответы:


827

При написании исходного кода HTML вы можете определить атрибуты ваших элементов HTML. Затем, как только браузер проанализирует ваш код, будет создан соответствующий узел DOM. Этот узел является объектом, и поэтому у него есть свойства .

Например, этот элемент HTML:

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

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

После того, как браузер проанализирует этот код, будет создан объект HTMLInputElement , и этот объект будет содержать десятки свойств, таких как: accept, accessKey, align, alt, атрибуты, автофокус, baseURI, флажок, childElementCount, childNodes, children, classList, className, высота клиента и т. д.

Для данного объекта узла DOM свойства - это свойства этого объекта, а атрибуты - это элементы attributesсвойства этого объекта.

Когда узел DOM создается для данного элемента HTML, многие его свойства относятся к атрибутам с одинаковыми или похожими именами, но это не отношение один к одному. Например, для этого элемента 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, и даже тогда один из них будет сопоставляться с другим и работать в обоих случаях с небольшим
падением

4
@oss Ваша ссылка ссылается на список атрибутов HTML. Этот список не является двусмысленным - это атрибуты.
Шиме Видас

Есть ли какие-либо документы об отношениях? @ ŠimeVidas
SKing7

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

1
@Pim Я не читал его сам, но эта серия статей из 4 частей кажется большим ресурсом: twitter.com/addyosmani/status/1082177515618295808
Шиме Видас

53

Прочитав ответ Симе Видаса , я искал больше и нашел очень простое и легкое для понимания объяснение в угловых документах .

Атрибут HTML и свойство DOM


Атрибуты определяются HTML. Свойства определяются DOM (объектная модель документа).

  • Некоторые атрибуты HTML имеют отображение 1: 1 на свойства. idэто один пример.

  • Некоторые атрибуты HTML не имеют соответствующих свойств. colspanэто один пример.

  • Некоторые свойства DOM не имеют соответствующих атрибутов. textContent это один пример.

  • Многие атрибуты HTML отображаются в свойствах ... но не так, как вы думаете!

Эта последняя категория сбивает с толку, пока вы не поймете это общее правило:

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

Например, когда браузер выполняет рендеринг <input type="text" value="Bob">, он создает соответствующий узел DOM со valueсвойством, инициализированным как «Bob».

Когда пользователь вводит «Sally» в поле ввода, value свойство элемента DOM становится «Sally». Но value атрибут HTML остается неизменным, когда вы обнаружите, если спросите элемент ввода об этом атрибуте: input.getAttribute('value')возвращает «Боб».

Атрибут 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 не должен представлять состояние документа в полной мере?)

Абсолютно важно, чтобы два поля ввода , например, текст и флажок, вели себя одинаково . Если поле ввода текста не сохраняет отдельное значение «когда оно было загружено» и «текущее, динамическое» значение, почему флажок установлен? Если у флажка действительно есть два значения для проверенного атрибута, почему у него нет двух значений для его атрибутов class и id ? Если вы ожидаете изменить значение текстового * входного * поля и ожидаете, что DOM (то есть «сериализованное представление») изменится и отразят это изменение, почему же вы не ожидаете того же от поля ввода флажок типа по проверенному атрибуту?

Дифференциация «это логический атрибут» просто не имеет для меня никакого смысла или, по крайней мере, не является достаточной причиной для этого.


21
Это не ответ, но я согласен с вами; это абсолютно безумно
Самуил

Да, это понятие отстой и не должно быть так плохо стандартизировано. Это был один из случаев (например, innerHTML), который был хорош в старом 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 или оба, оба работают, но я видел в моем собственном приложении, что prop работал там, где atrr не работал, поэтому я взял в своем приложении 1.6 prop =)


Эй, Даниэль, я читал это. Просто кажется, что есть четкое определение для разделения двух, поскольку некоторые из того, что упоминает Симе ниже, также могут быть добавлены к элементу HTML, например, alt. Мы продолжим читать некоторые спецификации HTML и посмотрим, есть ли способ четко различить их на практике.
schalkneethling

3
Этот документ относится к SVG, а не к HTML.
Лузадо

5

Различия в свойствах и атрибутах HTML:

Давайте сначала посмотрим на определения этих слов, прежде чем оценивать разницу в HTML:

Английское определение:

  • Атрибуты ссылаются на дополнительную информацию об объекте.
  • Свойства описывают характеристики объекта.

В контексте HTML:

Когда браузер анализирует HTML, он создает древовидную структуру данных, которая в основном представляет собой представление HTML в памяти. Это древовидная структура данных содержит узлы, которые являются HTML-элементами и текстом. Атрибуты и свойства относятся к этому следующим образом:

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

Также важно понимать, что сопоставление этих свойств не 1 к 1. Другими словами, не каждый атрибут, который мы даем в элементе HTML, будет иметь похожее свойство DOM с именем.

Кроме того, у разных элементов DOM разные свойства. Например, <input>элемент имеет свойство value, которого нет в <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 (chrome devtools, показаны не все свойства):

Свойства и атрибуты HTML

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