Является ли этот "побочный эффект" невинным
Нет, ясно.Будет ли это хорошо взаимодействовать с другими скриптами на странице?Не знаю ... это зависит от того, для чего он нужен и с какими другими типами сценариев вы ожидаете, что он будет комбинироватьсяВы никогда не сможете создать «плагин», который никогда не выйдет из строя при взаимодействии с другими плагинами и скриптами, но, сводя побочные эффекты к минимуму, вы можете хотя бы попытаться свести его к минимуму.
Обратите внимание, что id
не является уникальным идентификатором.Хотя в один конкретный момент времени в документе должен быть только один элемент с заданным идентификатором, (a) можно создать несколько элементов с одинаковым идентификатором и последовательно вставить в документ (возможно, один элемент заменит другой с тем же идентификатором), и(б) люди по-прежнему используют дубликаты, даже если это неправильно.Любой из них приведет к тому, что ваш кэш соберет старые, больше не используемые элементы и вернет их ненадлежащим образом.
К сожалению, не существует функции JavaScript для получения скалярного / хешируемого уникального идентификатора для произвольного объекта;единственный способ получить идентичность объекта - это ===
- сравнить с другими объектами.
Другим распространенным способом продвижения вперед является добавление к узлу произвольного нового свойства (в терминах IE - «expando») со случайным действительно уникальным идентификатором.Стандарты не гарантируют работоспособность расширений, но они работали во всех браузерах до первого дня и широко используются.
Так, например, jQuery уникально идентифицирует элементы, и если вы пишете плагин дляjQuery, вы можете попробовать воспользоваться этим - jQuery.expando
содержит имя произвольного свойства expando, используемого для этой цели ... или, придерживаясь документированного набора функций, data()
может быть использовано для добавления ваших собственных метаданных к элементувключая ваш собственный уникальный идентификатор.
У Expandos действительно есть некоторые неприятные побочные эффекты, включая случайную обработку их как атрибутов в IE <9 (которые не могут отличить свойства от атрибута), но если вы 'В любом случае, если вы используете jQuery, вам, вероятно, нечего терять. </p>
стоит ли оптимизировать мой декоратор?
Зависит от того, сколько вы ожидаетеиметь на странице.Сравнение каждого элемента с другим элементом является операцией O ( n ²);терпимый (и, вероятно, предпочтительный, учитывая побочные эффекты), если n низок, но быстро становится неуправляемым по мере роста n .