2011-08-27 32 views
15

पर अवैध मंगलाचरण मैं नीचे एक EventListener डाल करने के लिए इस प्रयास के दोनों संस्करणों के लिए एक Uncaught TypeError: Illegal invocation मिलती है: (मैं जब श्रोता जोड़ा जाना चाहिए त्रुटि मिलती है, जब मैं लक्ष्य पर क्लिक नहीं)Uncaught TypeError: addEventListener

ronan.addEventListener("click", alert, false);

addEventListener.apply(ronan, ["click", alert, false]);

ronan एक div तत्व यह है कि सांत्वना द्वारा सफलतापूर्वक लौटा दिया जाता है तो मैं यही समस्या है नहीं लगता है है। कोई विचार मुझे यह त्रुटि क्यों मिलती है? मैंने this धागा पढ़ा और मैं इसे इससे नहीं समझ पाया।

+0

शायद मुझे यह –

+1

सबमिट करने के लिए सुबह तक इंतजार करना चाहिए था यह 'चेतावनी' हो सकता है ... मूल कार्य क्या रिक्त 'फ़ंक्शन() {}' इसकी जगह पर काम करता है? – James

+0

@ जे-पी संख्या, जिसने –

उत्तर

29

आपको किसी फ़ंक्शन में alert लपेटने की आवश्यकता है। यह काम करेगा:

ronan.addEventListener("click", function() { alert('Hi'); }, false); 

यहाँ सबूत के लिए एक fiddle है। alert का उपयोग अकेले काम नहीं करता है क्योंकि जब श्रोता को निष्पादित किया जाता है तो उस फ़ंक्शन के भीतर this का मान उस ऑब्जेक्ट पर सेट होता है जिस पर यह सुन रहा है। उदाहरण के लिए, यदि आप ronan पर श्रोता सेट करते हैं, तो उस श्रोता this === ronan के भीतर। यह alert के लिए एक समस्या प्रस्तुत करता है क्योंकि उस कार्य को window के बराबर होने की उम्मीद है। आप (कोई यमक इरादा) एक और समारोह में समारोह लपेटकर या जो कुछ भी यह उम्मीद this होने के लिए करने के लिए यह बाध्यकारी इस पर काम कर सकते हैं:

document.body.addEventListener('click', alert.bind(window), false); 

मत भूलना कि IE < 9 में आप attachEvent उपयोग करने की आवश्यकता addEventListener के बजाए।


apply/call का उपयोग कर addEventListener

आपका दूसरा प्रयास के साथ काम नहीं करेगा क्योंकि आप window.addEventListener करने के लिए अपने तर्क लागू करने के लिए कोशिश कर रहे हैं, के रूप में, HTMLElement.prototype.addEventListener करने का विरोध किया है जो एक तरह से अलग है पर एक नोट फ़ंक्शन पूरी तरह से:

// This won't work 
addEventListener.apply(ronan, ["click", alert.bind(window), false]); 

// This will work 
HTMLElement.prototype.addEventListener.apply(ronan, ['click', alert.bind(window), false]); 
+1

ओह, शब्द, आप सही हैं। मैं वास्तव में प्रोटोटाइप ऑब्जेक्ट का उपयोग भी नहीं कर रहा हूं, बस आधार, लेकिन आपकी विधि अभी भी प्रोटोटाइप भाग के बिना काम करती है। मुझे शायद बीआईंड() से अवगत होना चाहिए क्योंकि मेरा जेएस डीओएम पर इतना केंद्रित है। अपने व़क्त के लिए बहुत - बहुत शुक्रिया! –

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