JavaScript. Подробное руководство, 6-е издание, стр. 208

Стандарт HTML5 предоставляет решение этой проблемы. В документах, соответствующих стандарту HTML5, все атрибуты, имена которых состоят только из символов в нижнем регистре и начинаются с приставки «data-», считаются допустимыми. Эти «атрибуты с данными» не оказывают влияния на представление элементов, в которых присутствуют, и обеспечивают стандартный способ включения дополнительных данных без нарушения стандартов.

Кроме того, стандарт HTML5 определяет в объекте

<b>Element</b>
свойство
<b>dataset</b>
. Это свойство ссылается на объект, который имеет свойства, имена которых соответствуют именам атрибутов data- без приставки. То есть свойство
<b>dataset.х</b>
будет хранить значение атрибута
<b>data-x</b>
. Имена атрибутов с дефисами отображаются в имена свойств с переменным регистром символов: атрибут
<b>data-jquery-test</b>
превратится в свойство
<b>dataset.jqueryTest</b>
.

Ниже приводится более конкретный пример. Допустим, что в документе имеется следующий фрагмент разметки:

<b>&lt;span class=&quot;sparkline&quot; data-ymin=&quot;0&quot; data-ymax=&quot;10&quot;&gt;</b>

<b>1 1 1 2 2 3 4 5 5 4 3 5 6 7 7 4 2 1</b>

<b>&lt;/span&gt;</b>

<b>Sparkline</b>
- это маленькое изображение, обычно некоторый график, предназначенное для отображения в потоке текста. Чтобы сгенерировать такое изображение, необходимо извлечь значение атрибута с данными, как показано ниже:

<b>// Предполагается, что в броузере поддерживается метод Array.map(),</b>

<b>// определяемый стандартом ES5 (или реализована его имитация) </b>

<b>var sparklines = document.getElementsByClassName(&quot;sparkline&quot;); </b>

<b>for(var і = 0; і &lt; sparklines.length; i++) { </b>

<b>  var dataset = sparklines[і].dataset; </b>

<b>  var ymin = parseFloat(dataset.ymin); </b>

<b>  var ymax = parseFloat(dataset.ymax);</b>

<b>  var data = sparklines[i].textContent.split(&quot; &quot;).map(parseFloat);</b>

<b>  drawSparkline(sparklines[i], ymin, ymax, data); // Еще не реализована</b>

<b>}</b>

На момент написания этих строк свойство

<b>dataset</b>
еще не было реализовано в текущих броузерах, поэтому представленное выше решение можно было бы реализовать так:

<b>var sparklines = document.getElementsByClassName(&quot;sparkline&quot;); </b>

<b>for(var і = 0; і &lt; sparklines.length; i++) { </b>

<b>  var elt = sparklines[i];</b>

<b>  var ymin = parseFloat(elt.getAttribute(&quot;data-ymin&quot;)); </b>

<b>  var ymin = parseFloat(elt.getAttribute(&quot;data-ymax&quot;)); </b>

<b>  var points = elt.getAttribute(&quot;data-points&quot;); </b>

<b>  var data = elt.textContent.split(&quot; ').map(parseFloat); </b>

<b>  drawSparkline(elt, ymin, ymax, data); // Еще не реализована</b>

<b>}</b>

Обратите внимание, что свойство

<b>dataset</b>
является (или будет, когда будет реализовано) «живым», двунаправленным интерфейсом к атрибутам
<b>data-</b>
элемента. Изменение или удаление свойства объекта
<b>dataset</b>
приводит к изменению или удалению соответствующего атрибута
<b>data-</b>
элемента.

Функция

<b>drawSparkline()</b>
в примере выше является вымышленной, однако в примере 21.13 демонстрируется прием рисования внутристрочных диаграмм (sparklines), подобных диаграмме в примере выше, с использованием элемента
<b>&lt;canvas&gt;</b>
.

15.4.4. Атрибуты как узлы типа Attr

Существует несколько способов работы с атрибутами элементов. Тип

<b>Node</b>
определяет свойство
<b>attributes</b>
. Это свойство имеет значение null для всех узлов, не являющихся объектами
<b>Element</b>
. Свойство
<b>attributes</b>
объектов
<b>Element</b>
является объектом, подобным массиву, доступным только для чтения, представляющим все атрибуты элемента. Подобно спискам
<b>NodeList</b>
, объект
<b>attributes</b>
не является статической копией. Он может индексироваться числами, что означает возможность перечисления всех атрибутов элемента, а также именами атрибутов:

<b>document.body.attributes[0] // Первый атрибут элемента &lt;body&gt;</b>

<b>document.body.attributes.bgcolor // Атрибут bgcolor элемента &lt;body&gt; </b>

<b>document.body.attributes[&quot;ONLOAD&quot;] // Атрибут onload элемента &lt;body&gt;</b>

Значениями, получаемыми в результате индексирования объекта

<b>attributes</b>
, являются объекты
<b>Attr</b>
. Объекты
<b>Attr</b>
- это специализированный подтип
<b>Node</b>
, но в действительности никогда не используемые в таком качестве. Свойства
<b>name</b>
и
<b>value</b>
объектов
<b>Attr</b>
возвращают имя и значение атрибута.

15.5. Содержимое элемента

Взгляните еще раз на рис. 15.1 и попробуйте ответить на вопрос: какой объект представляет «содержимое» элемента

<b>&lt;р&gt;.</b>
На этот вопрос можно дать три ответа: