Что случилось с добавляющими свойствами к объектам Элемента DOM?

Я искал прямой ответ для этого (я могу думать о большом количестве о возможностях, но я хотел бы знать истинную причину):

jQuery обеспечивает .data () метод для соединения данных с объектами Элемента DOM. Что делает это необходимым? Существует ли добавление задач свойства (или методы) непосредственно к Объектам Элемента DOM? Что это?

24
задан stephband 16 December 2009 в 15:25
поделиться

3 ответа

Есть ли проблема с добавлением свойств (или методов) непосредственно к объектам элементов DOM?

Возможно.

Не существует веб-стандарта, в котором говорилось бы, что вы можете добавлять произвольные свойства к узлам DOM. Это «объекты хоста» с реализациями для конкретного браузера, а не «собственные объекты JavaScript», с которыми, согласно ECMA-262, вы можете делать то, что вам нравится. Другие хост-объекты не позволят вам добавлять произвольные свойства.

На самом деле, поскольку самые ранние браузеры позволяли вам это делать, это де-факто стандарт, который вы можете в любом случае ... если вы намеренно не укажете IE, чтобы запретить это, установив document.expando = false . Вы, вероятно, сами этого не сделаете, но если вы пишете сценарий для развертывания в другом месте, это может вас заинтересовать.

Существует практическая проблема с произвольными свойствами в том, что вы на самом деле не знаете, что произвольное имя, которое вы выбрали, не имеет существующего значения в каком-то браузере, который вы еще не тестировали, или в будущей версии браузера или стандарта, который еще не существует. Добавьте свойство element.sausage = true , и вы не можете быть уверены, что ни один браузер в пространстве и времени не будет использовать это в качестве сигнала для включения захватывающей функции DOM Sausage Make The Browser Crash. Поэтому, если вы добавляете произвольное свойство, не забудьте дать ему маловероятное имя, например element._mylibraryname_sausage = true . Это также помогает предотвратить конфликты пространства имен с другими компонентами скрипта, которые могут добавлять произвольные свойства.

В IE существует еще одна проблема, заключающаяся в том, что добавляемые вами свойства неправильно обрабатываются как атрибуты. Если вы сериализуете элемент с помощью innerHTML , вы получите неожиданный атрибут на выходе, например.

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

(Обратите внимание, что это происходит только для свойств, значения которых являются простыми типами; Объекты, Массивы и Функции не появляются в сериализованном HTML. Я бы хотел, чтобы jQuery знал об этом, потому что способ, которым он работает для реализации метода data , совершенно ужасен, приводит к ошибкам и замедляет многие простые операции DOM.)

Если вы сериализуете элемент с помощью innerHTML , вы получите неожиданный атрибут на выходе, например.

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

(Обратите внимание, что это происходит только для свойств, значения которых являются простыми типами; Объекты, Массивы и Функции не появляются в сериализованном HTML. Я бы хотел, чтобы jQuery знал об этом, потому что способ, которым он работает для реализации метода data , абсолютно ужасен, приводит к ошибкам и замедляет многие простые операции DOM.)

Если вы сериализуете элемент с помощью innerHTML , вы получите неожиданный атрибут на выходе, например.

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

(Обратите внимание, что это происходит только для свойств, значения которых являются простыми типами; Объекты, Массивы и Функции не появляются в сериализованном HTML. Я бы хотел, чтобы jQuery знал об этом, потому что способ, которым он работает для реализации метода data , совершенно ужасен, приводит к ошибкам и замедляет многие простые операции DOM.)

43
ответ дан 28 November 2019 в 23:08
поделиться

Я думаю, вы можете добавить все необходимые свойства, при условии, что вы должны использовать их только сами, а свойство не является методом или каким-либо объектом, содержащим методы. Что плохого в том, что методы могут создавать утечки памяти в браузерах. Особенно, когда вы используете закрытие в таких методах, браузер может быть не в состоянии завершить очистку мусора, в результате чего разбросанные участки памяти остаются занятыми.

Эта ссылка прекрасно объясняет это.

здесь вы найдете описание нескольких распространенных паттернов утечки памяти

5
ответ дан 28 November 2019 в 23:08
поделиться

Это связано с тем, что DOM в IE не управляется JScript, что делает его совершенно другой средой для доступа. Это приводит к утечкам памяти http://www.crockford.com/javascript/memory/leak.html . Другая причина в том, что когда люди используют innerHTML для копирования узлов, все эти добавленные свойства не передаются.

4
ответ дан 28 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: