Javascript DOM: настройка пользовательских свойств элемента DOM - PullRequest
17 голосов
/ 26 октября 2011

Можно ли устанавливать пользовательские свойства для элементов DOM и полагаться на их сохранение?

Например, учитывая

 <html><body><div id="foo"></div></body></html>

Было бы справедливо сделать document.getElementById('foo').bar = "baz"; и ожидать, что document.getElementsByTagName('div')[0].bar будет равно "baz"?

Обратите внимание, что здесь я говорю о свойствах, как в обычных свойствах объектов javascript, а не об атрибутах элементов.

Меня интересует как кросс-браузер, так и его поддержка в любой спецификации.

Гарантирует ли DOM API, что один и тот же объект javascript будет возвращаться для одного и того же элемента DOM каждый раз?

Ответы [ 4 ]

6 голосов
/ 26 октября 2011

Как правило, не используйте пользовательские свойства. Вы не должны изменять объекты DOM так, как они этого не ожидают, потому что они могут вести себя не так, как вы думаете.

Механизм для пользовательских атрибутов в HTML5 заключается в использовании префикса data- .

Тем не менее, HTML5 не является стандартом и пока не так широко применяется. Но если вы используете set / getAttribute для атрибутов data- , это должно работать во всех разумно современных браузерах, и в будущем не следует вводить стандартный атрибут с data- префикс.

Но, сказав это, я все равно рекомендовал бы использовать пользовательский объект для хранения значений и ссылки на них по элементу id или class или какому-либо другому стандарту (как в HTML 4.01) значение атрибута. Он устраняет проблему пользовательских свойств и атрибутов и, как известно, работает везде.

4 голосов
/ 26 октября 2011

Ну, есть dataset свойство:

div.dataset.bar = 'baz';

но это не реализовано в IE.

Демо: http://jsfiddle.net/simevidas/dJr2u/

1 голос
/ 26 октября 2011

Нет.

Допустим, 5 лет назад вы думали, что свойство .contains является хорошим примером использования для определения того, содержит ли элемент какие-либо специальные данные.

Итак, вы написали document.getElementById("someId").contains = true

Тогда у вас были проверки вроде if (document.getElementByID("someId").contains)

Сегодня это ломается, потому что Node.prototype.contains - это метод.

в основном ваш код небезопасен в будущем.

0 голосов
/ 26 октября 2011

Это то, что спецификации говорят о внутренних методах доступа к свойствам:

Хост-объекты могут реализовывать эти внутренние методы любым способом, если только указано иное; например, одна возможность состоит в том, что [[Put]] для определенного хост-объекта действительно извлекать и хранить свойство значения, но [[HasProperty]] всегда генерирует false.

и

Хост-объекты могут определять дополнительные ограничения для [[Put]] операции. Если это возможно, хост-объекты не должны разрешать операции в ситуациях, когда возвращается это определение [[CanPut]] ложь.

Тем не менее, я думаю, что это всего лишь теоретический подход, и в действительности экспансия работает, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...