В чем разница между свойствами и атрибутами в HTML? - PullRequest
326 голосов
/ 14 мая 2011

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

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

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

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

Мысли?

Ответы [ 5 ]

704 голосов
/ 14 мая 2011

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

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

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

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

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

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

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

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

соответствующий узел DOM будет иметь свойства id, type и value (среди прочих):

  • Свойство id является отраженным свойством для атрибута id: получение свойства считывает значение атрибута, а установка свойства записывает значение атрибута.id является отраженным свойством pure , оно не изменяет и не ограничивает значение.

  • Свойство 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 отражает текст current -content внутри поля ввода, тогда как атрибут value содержит текстовое содержимое initial атрибута 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) и т. Д. Спецификация охватывает различные виды отражения.

41 голосов
/ 16 июня 2011

Ответы уже объясняют, как атрибуты и свойства обрабатываются по-разному, но я действительно хотел бы указать, насколько это безумно . Даже если это в какой-то степени спецификация.

Это безумие - иметь некоторые атрибуты (например, id, class, foo, bar ), чтобы сохранять только один тип значения в DOM, в то время как некоторые атрибуты (например, проверены, выбрано ) для сохранения двух значений; то есть значение «когда оно было загружено» и значение «динамическое состояние». (Разве DOM не должен представлять состояние документа в полном объеме?)

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

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

12 голосов
/ 25 декабря 2018

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

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


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

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

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

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

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

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

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

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

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

Атрибут HTML value указывает начальное значение; ДОМ value свойство является текущим значением.


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

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

Настройка свойства disabled кнопки отключает или включает кнопку. Значение свойства имеет значение.

Атрибут HTML и свойство DOM - это не одно и то же, даже когда они имеют одинаковое имя.

10 голосов
/ 14 мая 2011

ну, они определены w3c, что является атрибутом и что является свойством http://www.w3.org/TR/SVGTiny12/attributeTable.html

, но в настоящее время attr и prop не так уж отличаются, и есть почти одинаковые

, ноони предпочитают prop для некоторых вещей

Сводка предпочтительного использования

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

ну, на самом деле вам не нужно что-то менять, если вы используете attr или propили оба, оба работают, но я видел в своем собственном приложении, что prop работал там, где не работал atrr, поэтому я взял в своем приложении 1.6 prop =)

2 голосов
/ 28 ноября 2018

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

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

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

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

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

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

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

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

Кроме того, у разных элементов DOM разные свойства. Например, элемент <input> имеет свойство value, которого нет в свойстве <div>.

* +1040 * Пример: * * тысяча сорок один

Давайте возьмем следующий 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 properties and attributes

  • Мы видим, что атрибут id в HTML теперь также является свойством id в DOM. Идентификатор был инициализирован HTML (хотя мы могли бы изменить его с помощью JavaScript).
  • Мы видим, что атрибут класса в HTML не имеет соответствующего свойства класса (class зарезервированное ключевое слово в JS). Но на самом деле 2 свойства, classList и className.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...