2013-07-31 11 views
8

मैं वस्तुओं (विशेष रूप से easelJS चित्र) की एक सरणी है की एक सरणी ऐसे ईवेंट श्रोता कैसे जोड़ें - कुछ इस तरह:वस्तुओं

मुझे क्या करना चाहते हैं के बजाय एक घटना श्रोता है:

imageArray[index].addEventListener("click", function(){ 
    alert " you clicked region number " + index} 
:
gShape.addEventListener("click", function() {alert"stuff"}); 

मैं कार्यक्रम विशेष रूप से पता करने के लिए है जो इस क्षेत्र क्लिक किया जाता है, ताकि मैं निम्नलिखित तरीके से एक चेतावनी बॉक्स भेज सकते हैं चाहता हूँ 10

+0

आप क्या चाहते हैं उससे अलग क्या चाहते हैं? –

+0

यह काम करना चाहिए .. क्या आपने कोशिश की है? – putvande

+0

@ जेफमैन ऐसा लगता है कि यह एक लूप में है, जहां कॉलबैक – Ian

उत्तर

7

कुछ इस तरह काम करना चाहिए: क्योंकि यह एक बंद है कि चेतावनी संदेश में दिखाया जाएगा index का मूल्य रखती है बनाता है

for (var i = 0 ; i < imageArray.length ; ++i) { 
    function(index) { 
     imageArray[index].addEventListener("click", function() { 
      alert ("You clicked region number: " + index"); 
     }); 
    } (i); 
} 

कारण यह काम करता है है। प्रत्येक बार लूप के माध्यम से index का एक और मूल्य रखने वाला एक और बंद बनाता है।

+0

कोई भी जानता है कि मुझे क्यों गिरा दिया गया था? बस सोच रहा। –

+1

किसी ने शायद टाइमस्टैम्प की जांच नहीं की और सोचा कि आपने उपर्युक्त उत्तर की प्रतिलिपि बनाई है। –

8

निश्चित रूप से। आप उस पुनरावृत्ति की अनुक्रमणिका को सहेजने के लिए केवल एक बंद करने का उपयोग कर सकते हैं। अन्यथा एक ही कार्यक्षेत्र द्वारा साझा किया जाता है और आपको उसी पुनरावृत्ति का मूल्य देगा। प्रत्येक के लिए एक अलग समारोह बनाना, उस स्थिति को उस स्थिति के भीतर सहेज देगा।

var imageArray = new Array; 
gShape = new createjs.Shape(); 
// shape is something 
imageArray.push(gShape); // Dumped all the objects 

for(var i=0; i< immageArray.length; i++) { 
    (function(index) { 
     imageArray[index].addEventListener("click", function() { 
      console.log("you clicked region number " + index); 
     }) 
    })(i); 
} 

या बेहतर

for(var i=0; i< immageArray.length; i++) { 
     imageArray[i].addEventListener("click", bindClick(i)); 
} 

function bindClick(i) { 
    return function(){ 
      console.log("you clicked region number " + i); 
      }; 
} 
+1

आप जो कुछ भी करने के लिए आपका स्वागत है, लेकिन मैं सिर्फ पहला उदाहरण हटा दूंगा। न केवल अन्य उत्तरों के पास यह है कि, मुझे नहीं लगता कि इसे वास्तव में कभी भी इस्तेमाल किया जाना चाहिए जब आप कुछ क्लीनर का उपयोग कर सकते हैं और अपने दूसरे उदाहरण की तरह अधिक कुशल – Ian

+4

@Ian .. मैं आपसे सहमत हूं .. लेकिन मामले हो सकते हैं जब उपयोगकर्ता का यह समझ में नहीं आता कि यह वास्तव में कैसे काम करता है, जब तक कि वर्बोज़ उदाहरण दिखाई न दे .. यही कारण है कि मैंने पहला उदाहरण छोड़ा ताकि वे तुलना कर सकें कि पहला उदाहरण क्लीनर तरीके से कैसे लिखा जा सकता है –

+0

धन्यवाद @ सुशांत- - - मैं पहले इन "लैम्ब्डा उठाने" स्थितियों को समाप्त करता हूं और आम तौर पर बेहतर तरीके से काम कर सकता हूं, लेकिन दो तरफ से देखना अच्छा होता है। – phatskat

1

ज़रूर, एक बंद समाधान है, लेकिन जब से वह मिला है Ext भरी हुई वह भी इसका इस्तेमाल करते हैं और कुछ बहुत ही पठनीय कोड प्राप्त हो सकता है। सूचकांक Ext.Array.each पर दूसरे तर्क के रूप में पारित किया गया है (Ext.each पर उपनाम)।

Ext.each(imageArray, function(gShape, index) { 
    gShape.addEventListener("click", function() { 
     alert("You clicked region number " + index); 
    }); 
}); 
0

यह है कि मैं क्या div पहचान-पत्र के लिए उपयोग कर रहा हूँ है:

var array = ['all', 'what', 'you', 'want']; 

function fName() { 
    for (var i = 0; i < array.length; i++) 
    document.getElementById(array[i]).addEventListener('click', eventFunction); 
}; 

गुड लक!