Неправильная практика заключается в добавлении свойств к узлам DOM?
JavaScript позволяет добавлять произвольные свойства и методы к любому объекту, включая узлы DOM. Предполагая, что свойство было хорошо импоставлено (что-то вроде _myLib_propertyName
), так что вряд ли возникнет конфликт, есть ли веские причины не записывать данные в узлы DOM?
Есть ли хорошие примеры использования?
Я полагаю, что это часто может способствовать неаккуратным стилям кодирования или кодам, которые вводят в заблуждение или противоречат интуиции, но, похоже, также бывают случаи, когда перетаскивание "пользовательских" свойств в узлы DOM будет эффективным и целесообразным методом.
Ответы
Ответ 1
Я думаю больше всего на свете, лучшая причина не хранить данные в DOM заключается в том, что DOM предназначен для представления структуры контента и стилизации для HTML-страницы. Хотя вы, несомненно, могли бы добавлять данные в узлы в порядке имен, чтобы избежать конфликтов, вы вводите состояние данных в визуальное представление.
Я пытаюсь найти пример для хранения данных в DOM или против них и почесываю голову, чтобы найти убедительный пример. Раньше я обнаружил, что разделение состояния данных от визуального состояния спасло головную боль во время повторных проектов сайтов, над которыми я работал.
Ответ 2
Нет, обычно плохая идея хранит ваши собственные свойства на узлах DOM.
- Узлы DOM - это объекты-хосты, а объекты-хосты могут делать то, что им нравится. В частности, в спецификации ECMAScript для объектов-хостов нет требования разрешить такое расширение, поэтому браузеры не обязаны его разрешать. В частности, новые браузеры могут отказаться, а существующий код, основанный на нем, сломается.
- Это не все объекты хоста в существующих браузерах. Например, текстовые узлы и все объекты ActiveX (такие как объекты XMLHttpRequest и XMLDOM, используемые для синтаксического анализа XML) в IE не выполняются, а поведение отказа варьируется от ошибок бросания до молчащего сбоя.
- В IE возможность добавления свойств может быть отключена для целого документа, включая все узлы в документе, с линией
document.expando = false;
. Таким образом, если какой-либо из кода на вашей странице включает эту строку, весь код, основанный на добавлении свойств на узлы DOM, завершится с ошибкой.
Ответ 3
Если вы посмотрите на HTML 5, есть атрибут data для полей, который позволит вам хранить информацию для поля.
Ответ 4
Не удивляйтесь, столкнувшись с проблемами с IE 6 и 7. Они очень несовместимы с setAttribute vs set как свойство.
И если вы не будете осторожны, вы можете установить круговые ссылки и дать себе утечку памяти.
http://www.ibm.com/developerworks/web/library/wa-memleak/
Я всегда устанавливал свойства node как последнее средство, и когда я это делаю, я очень осторожен с моим кодом и тестирую более тяжело, чем обычно.