2012-11-08 15 views
6

Próbuję powiązać pewne "prywatne" dane z elementami DOM. Zamiast dodawać te dane do samego elementu DOM (chciałbym uniknąć zmiany elementu DOM), mam oddzielny obiekt danych, który chcę użyć jako mapy.Używanie elementów DOM jako kluczy do mapy javascript

Zamiast:

document.GetElementById('someElementId').privateData = {}; 

chcę zrobić

internalPrivateDataMap[document.GetElementById('someElementId')].privateData = {}; 

Nie wszystkie elementy mają pole id, a niektóre są tworzone dynamicznie, więc nie można używać jako identyfikator klawisz.

Działa to dobrze dla większości elementów, ale dla elementów "a", klucz, który jest używany, wydaje się być href elementu, myślę, ponieważ DOM definiuje funkcję toString() dla elementów.

Wynikiem tego jest to, że jeśli mam dwa elementy "a" z tym samym href, to udostępniają one dane prywatne, których nie chcę.

Moje bieżące obejście polega na wygenerowaniu wewnętrznego unikalnego identyfikatora, którego mogę użyć jako klucza, ale to wymaga modyfikacji elementu DOM, którego próbuję uniknąć.

+0

Jakie jest twoje pytanie? – Madbreaks

+1

* "To działa dobrze dla większości elementów" * Tak jest? Myślę, że w ten sposób otrzymasz ogólny klucz '[object HTMLDivElement]'. ... ale tak, kotwica da jej 'href' jako wartość' .toString() '. –

+2

Musisz poczekać na * ES.Następny *. * WeakMaps * pozwoli na to. – jAndy

Odpowiedz

7

Jak zauważyłeś, nie działa to niezawodnie i nie wiem, jak to zrobić, bez podania każdego elementu (wygenerowanego) identyfikatora lub przynajmniej przypisania unikalnego identyfikatora do nowego pola elementu niestandardowego; Węzły DOM po prostu nie mają wymaganych właściwości do działania jako klucze na mapie.

Tak naprawdę masz te rozwiązania lewej:

  • przypisać każdy element wygenerowany identyfikator, chyba że ma już jeden
  • przypisać unikalny identyfikator do nowego pola prywatnego. W ten sposób możesz ograniczyć wpływ pamięci na węzeł DOM i zachować prywatne dane w innym miejscu. Nie zapomnij, że musisz wyczyścić prywatne dane w jakiś sposób po usunięciu elementów DOM.
  • użyć coś jak jQuery, który ma element.data() czytać i umieścić prywatnych danych do elementu DOM
  • Użyj własnego element.privateData = {}; pamiętać, że wciąż potrzeba porządki dla obsługi zdarzeń, które prowadzą odnośniki do elementu lub trzeba będzie nieoczekiwanych wycieków pamięci.
+0

+1. Oczywiście, # 3 (jQuery) faktycznie robi # 2 (prywatny identyfikator) za kulisami ... – lonesomeday

+0

Zakładając, że każdy element nie może mieć identyfikatora, użyłbym tylko ostatniego. Zdecydowanie najprostszy. –

+1

@ user1689607: Może to powodować problemy, takie jak wycieki pamięci. Ponadto nie można mieć dwóch wartości dla tego samego klucza, tj. Jeśli masz dwa frameworki, które próbują zapisać wartości prywatne, mogą się ze sobą ingerować. –

Powiązane problemy