Ответ 1
Есть ли проблема с добавлением свойств (или методов) непосредственно к объектам DOM Element Objects?
Потенциально.
Нет веб-стандарта, в котором говорится, что вы можете добавлять произвольные свойства к узлам DOM. Это "объекты-хосты с реалиями, специфичными для браузера", а не "собственные JavaScript-объекты", которые, согласно ECMA-262, могут делать то, что вам нравится. Другие объекты хоста не позволят вам добавлять произвольные свойства.
На самом деле, поскольку самые ранние браузеры позволяли вам это делать, это стандарт де-факто, который вы можете в любом случае... если вы не намеренно скажете IE, чтобы запретить его, установив document.expando= false
. Вы, вероятно, не сделали бы этого самостоятельно, но если вы пишете script для развертывания в другом месте, это может вас затронуть.
Существует практическая проблема с произвольными свойствами в том, что вы действительно не знаете, что произвольное имя, которое вы выбрали, не имеет существующего значения в каком-либо браузере, который вы еще не тестировали, или в будущей версии браузер или стандарт, который еще не существует. Добавьте свойство element.sausage= true
, и вы не можете быть уверены, что ни один браузер в любом месте в пространстве и времени не будет использовать это в качестве сигнала, чтобы задействовать захватывающий DOM Sausage Make The Browser Crash. Поэтому, если вы добавляете произвольное свойство, удостоверьтесь, что это маловероятное имя, например element._mylibraryname_sausage= true
. Это также помогает предотвратить конфликты пространства имен с другими компонентами script, которые могут добавить произвольные свойства.
В IE есть еще одна проблема в том, что добавленные вами свойства неправильно обрабатываются как атрибуты. Если вы сериализуете элемент с помощью innerHTML
, вы получите неожиданный атрибут на выходе, например. <p _mylibraryname_sausage="true">
. Если вы затем присвоите эту строку HTML другому элементу, вы получите свойство в новом элементе, потенциально запутав ваш script.
(Обратите внимание, что это происходит только для свойств, значения которых являются простыми типами: объекты, массивы и функции не отображаются в сериализованном HTML. Я хочу, чтобы jQuery знал об этом, потому что он работает вокруг него для реализации метода data
абсолютно ужасен, приводит к ошибкам и замедляет многие простые операции DOM.)