2012-01-03 11 views
8

यह मुझे पागल कर रहा है ... मेरे पास एक लूप है जो एक ईवेंट श्रोता को एक एसवीजी ऑब्जेक्ट में जोड़ता है। ऑब्जेक्ट तर्क के लिए, एक छोटा सर्कल है, और मुझे 10 सर्किलों में से प्रत्येक के लिए माउसओवर और माउसआउट ईवेंट जोड़ना है।addEventListener को ईवेंट पास नहीं कर सकता: बंद करने की समस्या

मेरी पहली समस्या मानक बंद-स्कोप चीज है - क्योंकि सभी श्रोताओं को एक ही लूप में जोड़ा जाता है, वे सभी लूप चर के समान अमान्य मान को देखते हैं। मैं इसे ठीक कर सकता हूं, मुझे लगता है, लेकिन दूसरी समस्या यह है कि मुझे श्रोताओं को 'ईवेंट' पास करना होगा, और मुझे इन दोनों मुद्दों को एक साथ ठीक करने का कोई तरीका नहीं मिल रहा है।

मैं इस के विभिन्न संस्करणों की कोशिश की है:

for(month = 0; month < nMonths; month++) { 
    ... 
    shape.addEventListener(
    "mouseover", 
    (function(event, index) { popup_on(event, foo, index); })(event, month), 
    false); 
    group.appendChild(shape); 
} 

इस विशेष संस्करण मुझे देता है 'घटना से परिभाषित नहीं है'। popup_on वास्तविक हैंडलर है, और event और month का वर्तमान मान प्राप्त करना चाहिए। कोई विचार है कि मुझे यह कैसे करना चाहिए? धन्यवाद।

उत्तर

15

यह ईवेंट आपके फ़ंक्शन स्वचालित रूप से पर पारित किया जाएगा - इसे addEventListener पर जाने वाले फ़ंक्शन के लिए पहला तर्क दें। साथ ही, कैप्चर पैरामीटर के लिए गलत मान डिफ़ॉल्ट है।

(function() { 
    var i = month; 
    shape.addEventListener("mouseover", function(e) { popup_on(e, foo, i); }); 
})(); 

इसके अलावा, आप foo साथ ठीक आपके घटना कॉलबैक में अधिक बंद किया जा रहा है? यदि नहीं, तो आप इसे

(function() { 
    var i = month; 
    var f = foo; 
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); }); 
})(); 

साथ एक ही बात कर सकता है और अगर इन सभी स्थानीय चर कष्टप्रद हो रही है, तो आप उन्हें मापदंडों संभवतः चीजों में थोड़ा और अधिक सुव्यवस्थित

(function(i, f) { 
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); }); 
})(month, foo); 
+0

क्षमा होने के लिए बनाने के लिए कर सकते हैं इतना मूर्ख, लेकिन मैं वास्तव में यह समारोह कहां रखूं? 'आकृति' एक लूप में बनाया गया है, शायद 10 या 20 गुना अधिक, और 'आकार' के प्रत्येक नए उदाहरण ('createElementNS' से) के पास एक हैंडलर संलग्न होना चाहिए। तो ऐसा कहीं भी प्रतीत नहीं होता है जहां मैं यह अनाम कार्य डाल सकता हूं जहां वर्तमान 'आकार' संदर्भ में है? यह देखते हुए, क्या मुझे सब कुछ 'addEventListener' कॉल में नहीं रखना है? जो, मुझे लगता है, इस समस्या को छोड़ देता है कि मैं दोनों 'ई' और 'माह' को पैराम्स के रूप में कैसे प्राप्त कर सकता हूं ...? – EML

+0

@ user785194 मुझे लगता है कि ऊपर दिया गया कोड ठीक काम करेगा। प्रत्येक बार आकार फिर से बनाया जाता है, ईवेंट ईवेंट श्रोता को उस विशेष उदाहरण में जोड़ने के लिए ऊपर दिए गए कोड को ऊपर रखें। –

+0

शानदार - यह किया। धन्यवाद। – EML

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