LINUX.ORG.RU

Создать уникальный строковый ключ-идентификатор для DOM-элемента

 , ,


0

1

Предположим есть:

var itemsData = {};
function addItemData(item, data) {
    var iKey = ???;
    if (!itemsData[iKey]) {
        itemsData[iKey] = data;
    }
}
var elem = document.getElementById('my-elem');
addItemData(elem, [1,2,3]);
Откуда кроссбраузерно взять уникальный ключ так, чтобы если ниже по коду передается DOM-элемент, данные для которого уже есть в itemsData, то повторно их уже не добавлять? Не засирая при этом сами DOM-элементы левыми свойствами.

http://htmlbook.ru/html/attr/id

Идентификатор в коде документа должен быть в единственном экземпляре, иными словами, встречаться только один раз.

wiktionary.org/wiki/уникальный

единственный в своём роде, неповторимый, существующий в одном экземпляре

anonymous
()
Ответ на: комментарий от anonymous

Ну ты понел, да - я могу туда добавить элемент найденный не только через getElementById.

item в качестве ключа

Так получится что будет добавлена ссылка на этот элемент. Да, будет работать, но плодить ссылки таким вот макаром - в ишаке потечёт память - у него уборщик - гмно.

Вообще пример в топике абстрактен - на деле это функция анимации:

animate(elem, styles, duration);
Так вот если предыдущая анимашка для ЭТОГО элемента еще не отработала, а уже вызвали новую, мне надо прекратить текущую и начать новую. В жуйквере например это делает булевый параметр queue. Но у меня тут на чистом, и я пошел другим путем - не оборачиваю найденные элементы в объект, как это сделано в жуйквере.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вобщем запилил как ты подсказал - ключом является сам элемент (ссылка на него). Ну и проверяю, если в списке есть такой ключ то тупо очищаю таймаут таймер и удаляю этот элемент. При завершении анимашки так же подчищаю за собой.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Проверил на коллекции - оно не работает должным образом. Тут явно должен быть строковый идентификатор.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Не-не, я таки наоборот хочу не трогать сами DOM-элементы, не добавлять к ним никаких нестандартных свойств или атрибутов. Так же не хочу оборачивать их во что-то, в чем придется хранить такой уникальный идентификатор.

Ну вот например в жквере - в обертке хранятся все данные для анимашек, таймаутов, ивентов и прочего, и при удалении элемента таки удобно удаляются все разом.

Жаль что xpath не везде поддерживается, а тащить левую либу неохота, итак дофига будет ф-ционала.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

data-* это «стандартные» свойства, специально для данных.

https://developers.whatwg.org/content-models.html#embedding-custom-non-visible-data-with-the-data-*-attributes

У нас тут, похоже, недосаточно крутой парсер ссылок :}

Deleted
()
Последнее исправление: Mystra_x64 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Да, и эти «стандартные» data-* св-ва устанавливаются прямо в DOMe через setAttribute(), чего я и хотел избежать.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

И в чём проблема? element.dataset.ololo тогда делай.

Deleted
()

Откуда кроссбраузерно взять уникальный ключ

Ниоткуда, увы.

Можешь на коленке составлять свой xpath-путь, но наверняка какие-нибудь неприятные нюансы вылезут. Так что вариант со своими свойствами, наверное, самый простой и адекватный.

risenshnobel ★★★
()
Ответ на: комментарий от deep-purple

Не получится. В яваскрипте объект пока не может быть ключом, от этого все проблемы.

Можно конечно сэмулировать weakmap, но это будет ад и протекание памяти.

Проще всего в data-атрибуты чего-нибудь записывать, как советовали выше.

Vit ★★★★★
()
Ответ на: комментарий от anonymous

Ты бы хоть глянул перед тем как запостить, где оно поддерживается, а где нет.

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

deep-purple ★★★★★
() автор топика

Не засирая при этом сами DOM-элементы левыми свойствами.

Ну, если каждый из этих DOM-элементов и так обладает каким-то набором уникальных свойств, можно сделать на их основе какой-нибудь хэш. Например, SHA-256 и количество символов в innerHTML outerHTML. Есть, правда, вероятность коллизий.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от proud_anon

Кроме коллизий это еще и отожрет ресурсов.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Не, замысел - не засирать элементы левыми св-вами.

Я всё не могу понять, почему эта задача вообще возникла? Почему ни в коем случае нельзя добавлять свойства элементам?

proud_anon ★★★★★
()
Ответ на: комментарий от Deleted

Уже бьют - виш вон как уши на аве распухли ))

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

А так что никто не видел что я уже решил эту задачу?

Ты имеешь в виду это?

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

Так это ты её не решил. Это ты в своём конкретном случае как-то выкрутился. Хотя, конечно, твой конкретный случай возник из-за каких-то твоих собственных религиозных представлений, поэтому общий смысл этого топика таков:

— Здравствуйте, как, находясь в пещере, определить, где находится гора Эверест?
— А зачем, находясь в пещере, определять, где находится гора Эверест?
— Ну, у меня религия требует три раза в день молиться в сторону Эвереста, поскольку Эверест — это пуп Земли и центр Вселенной. На поверхности я пользуюсь астролябией, но в пещере звёзд не видно, а ещё там залежи ферритов, и компас не работает.
— А... э... ну, надо перед входом в пещеру определить стороны света...
— Но мои товарищи странно смотрят на меня, когда я останавливаюсь перед пещерой и начинаю рассчитывать, где Эверест.
— Ну, так это самое... ну... трудно сказать.
— А, фиг с ним. Я перечитал священные тексты, и там сказано, что железо есть главный металл и вместилище духа Эвереста, поэтому находясь рядом с залежами ферритов можно молиться в их сторону. Возьму с собой компас, да и всё.
— Ну как хочешь, чего...

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.