2012-11-08 15 views
6

पर कुंजी के रूप में DOM तत्वों का उपयोग करना मैं कुछ "निजी" डेटा को DOM तत्वों से संबद्ध करने का प्रयास कर रहा हूं। उस डेटा को डीओएम तत्व में जोड़ने के बजाय (मैं डीओएम तत्व को बदलने से बचना चाहता हूं), मेरे पास एक अलग डेटा ऑब्जेक्ट है जिसे मैं मानचित्र के रूप में उपयोग करना चाहता हूं।जावास्क्रिप्ट मानचित्र

बजाय:

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

मैं

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

नहीं सभी तत्वों एक आईडी क्षेत्र है क्या करना चाहते हैं, और कुछ डायनामिक रूप से तैयार कर रहे हैं, तो मैं के रूप में आईडी का उपयोग नहीं कर सकते कुंजी।

यह अधिकांश तत्वों के लिए ठीक काम करता है, लेकिन "ए" तत्वों के लिए, उपयोग की जाने वाली कुंजी तत्व का href प्रतीत होता है, मुझे लगता है क्योंकि DOM तत्वों के लिए एक toString() फ़ंक्शन को परिभाषित करता है।

इसका नतीजा यह है कि यदि मेरे पास एक ही href के साथ दो "ए" तत्व हैं, तो वे निजी डेटा साझा कर रहे हैं, जो मैं नहीं चाहता हूं।

मेरा वर्तमान वर्कअराउंड एक आंतरिक अद्वितीय आईडी उत्पन्न करना है जिसे मैं एक कुंजी के रूप में उपयोग कर सकता हूं, लेकिन इसके लिए मुझे डीओएम तत्व को संशोधित करने की आवश्यकता है, जिसे मैं टालने की कोशिश कर रहा हूं।

+0

आपका प्रश्न क्या है? – Madbreaks

+1

* "यह अधिकांश तत्वों के लिए ठीक काम करता है" * यह करता है? मुझे लगता है कि आपको एक सामान्य कुंजी '[ऑब्जेक्ट HTMLDivElement]' मिल जाएगी। ... लेकिन हाँ, एक एंकर अपने 'href' को' .toString() 'मान के रूप में देगा। –

+2

आपको * ES.Next * के लिए प्रतीक्षा करनी है। * WeakMaps * इसकी अनुमति देगा। – jAndy

उत्तर

7

जैसा कि आपने देखा है, यह विश्वसनीय रूप से काम नहीं करता है और मुझे हर तत्व को एक (जेनरेट) आईडी देने या कम से कम एक नए कस्टम तत्व फ़ील्ड को एक अद्वितीय आईडी देने के बिना काम करने का कोई तरीका नहीं है; मानचित्र में कुंजी के रूप में काम करने के लिए डोम नोड्स में आवश्यक गुण नहीं हैं।

तो तुम सच में इन समाधानों को छोड़ दिया है:

  • प्रत्येक तत्व एक उत्पन्न ID असाइन करें जब तक कि यह पहले से ही एक
  • है एक नए निजी क्षेत्र के लिए एक अद्वितीय ID असाइन करें। इस तरह, आप प्रति डोम नोड के प्रति मेमोरी प्रभाव को छोटा रख सकते हैं और फिर भी अपना निजी डेटा एक अलग जगह पर रख सकते हैं। यह न भूलें कि किसी भी तरह से निजी डेटा को साफ करने की आवश्यकता है जब DOM तत्व हटा दिए जाते हैं।
  • jQuery की तरह कुछ का उपयोग करें जो element.data() है पढ़ सकते हैं और किसी DOM तत्व
  • में निजी डेटा डाल का प्रयोग करें अपनी खुद की element.privateData = {}; ध्यान दें कि आप अभी भी ईवेंट हैंडलर्स जो तत्व के लिए संदर्भ रखने या अनपेक्षित मेमोरी लीक होगा के लिए सफाई की जरूरत है।
+0

+1। बेशक, # 3 (jQuery) वास्तव में दृश्यों के पीछे # 2 (एक निजी आईडी) करता है ... – lonesomeday

+0

मानते हैं कि प्रत्येक तत्व में आईडी नहीं हो सकती है, मैं बस अंतिम का उपयोग करूंगा। अब तक सबसे सरल है। –

+1

@ user1689607: यह स्मृति रिसाव जैसी समस्याएं पैदा कर सकता है। साथ ही, आपके पास एक ही कुंजी के लिए दो मान नहीं हो सकते हैं, यानी यदि आपके पास दो फ्रेमवर्क हैं जो निजी मूल्यों को सहेजने का प्रयास करते हैं, तो वे एक दूसरे के साथ हस्तक्षेप कर सकते हैं। –

संबंधित मुद्दे