Под капотом JQuery использует карту «UUID» (просто счетчик, который он поддерживает как jQuery.uuid
), чтобы обойти хорошо известные проблемы с утечкой памяти, которые возникают у браузеров при присоединении свойства к тегу в DOM из Javascript. Вместо этого JQuery использует $. Data (tag, name, value)
для хранения данных на карте с ключом uuid (ключ, который можно определить, проверив tag [ jQuery.expando]
).
Хотя $. data ()
очень полезен, бывают случаи, когда вы хотите сопоставить данные с тегами, не сбрасывая эти данные в одну глобальную корзину - вам нужен ваш иметь меньший объем данных, который вы можете, например, проверить длину или просмотреть.
В качестве надуманного примера предположим, что у вас есть значки, которые при нажатии меняют одно из 4 состояний. Когда один из них находится в состоянии 2, вы хотите добавить его к массиву значков в состоянии 2. Наиболее очевидный способ сделать это - добавить тег в массив; однако это приведет к утечке памяти. Вы можете вызвать $. Data ()
для флажка, но это не совсем выполняет то, что вы пытаетесь сделать - вам придется пройти через все флажки, проверяя $. Data ()
против них, чтобы выяснить, какие из них есть в списке, а какие нет.
Вам нужно сохранить некоторую абстракцию тегов в массиве, и это UUID jQuery. Вы можете написать свою собственную функциональность UUID, но в идеале вы просто используете функциональность UUID, уже встроенную в JQuery, как по соображениям размера кода, так и по соображениям качества. Вы можете попросить JQuery неявно присоединить UUID к тегу, вызвав $. Data (tag, 'неуместно', 1)
, а затем проверив tag [jQuery.expando]
, чтобы получить его UUID и, наконец, используйте его в списке ... но это своего рода взлом. На самом деле, было бы идеально, если бы в общедоступном API было представлено следующее:
$. GetUuid (tag)
: проверяет и создает UUID, если таковой не существует - в идеале метод выводится из $ .data ()
и создает или получает uuid для переданного тега.
Итак, есть ли причина, по которой это не учитывается в собственном методе jQuery? Это чем-то вредно? Разве это никогда не казалось чем-то полезным?
Я должен отметить, что я фактически учел это в версии jQuery, которую мы используем, и это очень полезно. Но, возможно, есть скрытый риск, которому я не подвержен при использовании. Я также знаю плагин, который вроде как выполняет это, но он немного сломан, а наличие двух кодовых путей для выполнения одной и той же функциональности UUID является немного расточительным и немного хрупким.