2013-12-14 14 views
8

मैं इस कोड है:addEventListener,(), अनुक्रमणिका के लिए। बंद करने का उपयोग कैसे करें?

var items = this.llistat.getElementsByTagName('a'); 

for(var i = 0; i < items.length; i++){  
    items[i].addEventListener('click', function(event) { 
    alert(i); 
    }, items[i]); 
} 

जहां घटना सुनी है, लेकिन 3 आइटम हैं और सतर्क allways, तत्वों (यह सूचकांक सम्मान नहीं करता है) में से किसी पर 3 प्रिंट

items[i] को बंद करने के रूप में नौकरी नहीं करना चाहिए?

धन्यवाद!

+0

करने के लिए [ 'addEventListener' तीसरा तर्क ] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener) एक बूलियन है जो इंगित करता है कि ईवेंट श्रोता को प्राथमिकता कैप्चर हो जाती है (उदाहरण के लिए, इसे रद्द करने योग्य बनाने के लिए); यह ''' मान निर्दिष्ट नहीं करता है। – apsillers

+0

इसके अलावा, [जावास्क्रिप्ट कुख्यात लूप समस्या?] (Http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem)। –

उत्तर

9

एक शास्त्रीय बंद मुद्दा है कि: आप बंधन के समय में एक नया कार्य के लिए बाध्य है, न कि 'मैं' चर करने के लिए, लेकिन अपने मूल्य के लिए बनाना चाहिए:

var items = this.llistat.getElementsByTagName('a'); 

for(var i = 0; i < items.length; i++) { 
     items[i].addEventListener('click', listener.bind(null, i)); 
} 

function listener(index) { 
     alert(index); 
} 
+0

आपके उत्तरदाता के लिए धन्यवाद, यह काम करता है। क्या यह केवल अनौपचारिक कार्यों का उपयोग कर सकारात्मक है? बस उत्सुक .. धन्यवाद! –

+0

आपका स्वागत है। श्रोता के अंदर संग्रहीत फ़ंक्शन अज्ञात है। हो सकता है कि आप इस इंटरमीडिएट var को नहीं बनाना चाहते हैं और इसके मूल्य से addEventListener, 'श्रोता' के अंदर बस प्रतिस्थापित करना चाहते हैं। फिर भी मुझे लगता है कि यह इस तरह से अधिक आसानी से समझा जाता है। – GameAlchemist

+0

जावास्क्रिप्ट दुभाषिया अनुकूलित नहीं करते हैं इसलिए 'फ़ंक्शन श्रोता (अनुक्रमणिका) {वापसी फ़ंक्शन() {...} को परिभाषित करने के लिए यह अधिक कुशल है; } 'लूप के बाहर फिर एक ही कथन' आइटम [i] .addEventListener ('क्लिक', श्रोता (i)); 'लूप के अंदर। एक बार बाहरी समारोह को परिभाषित करने से दक्षता उत्पन्न होती है। जैसा कि बाहरी कार्य के ऊपर लिखा गया है, लूप के प्रत्येक पुनरावृत्ति पर परिभाषित (और निष्पादित) है। –

7

नहीं, addEventListener का तीसरा तर्क useCapture एक है। अधिक जानकारी के लिए MDN देखें।

लेकिन आप उपयोग कर सकते हैं:

for(var i = 0; i < items.length; i++){ 
    (function(i){ 
     items[i].addEventListener('click', function(event) { 
      alert(i); 
     }, false); 
    })(i); 
} 

या

var handler = function(event) { 
    var i = items.indexOf(this); 
    alert(i); 
}; 
for(var i = 0; i < items.length; i++){ 
    items[i].addEventListener('click', handler, false); 
} 

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

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