Подтвердить что ты не робот

Javascript DOM: настройка пользовательских свойств элемента DOM

Можно ли устанавливать пользовательские свойства в элементах 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 каждый раз?

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

Нет.

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

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

Затем у вас были такие чеки, как if (document.getElementByID("someId").contains)

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

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

Ответ 4

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

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

и

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

Однако, я думаю, это просто теоретическое, и на самом деле expandos работает так, как ожидалось.