2010-02-03 25 views
12

एक लूप में बंद होने से मुझे समस्याएं पैदा हो रही हैं। मुझे लगता है कि मुझे एक और फ़ंक्शन बनाना है जो समस्या को हल करने के लिए एक फ़ंक्शन देता है, लेकिन मैं इसे अपने jQuery कोड के साथ काम नहीं कर सकता।लूप

यहाँ एक सरल रूप में बुनियादी समस्या है:

function foo(val) { 
    alert(val); 
} 

for (var i = 0; i < 3; i++) { 
    $('#button'+i).click(function(){ 
    foo(i); 
    }); 
} 

स्वाभाविक रूप से तीन बटन में से किसी पर क्लिक करके एक चेतावनी 3. कह कार्यक्षमता मैं चाहता हूँ कि बटन 1 पर क्लिक एक चेतावनी दे देंगे दे देंगे 1 कह रहा है, बटन 2 कहेंगे 2 आदि

मैं इसे कैसे कर सकता हूं?

उत्तर

10

bind विधि देखें।

$('#button'+i).bind('click', {button: i}, function(event) { 
    foo(event.data.button); 
}); 

डॉक्स से:

वैकल्पिक eventData पैरामीटर आमतौर पर इस्तेमाल किया नहीं है। प्रदान किए जाने पर, यह तर्क हमें हैंडलर को अतिरिक्त जानकारी पास करने की अनुमति देता है। इस पैरामीटर में से एक काम उपयोग बंद की वजह से मुद्दों पर काम करने के लिए है

+0

धन्यवाद, यह काम करता है। – Rob

+0

मेरे लिए भी काम किया! – bychkov

+0

+1, मेरी समस्या को भी हल करें – anvd

3

jQuery से चाहते प्रत्येक समारोह का प्रयोग करें - मुझे लगता है कि आप एक ऐसी ही तत्वों के माध्यम से पाशन - तो की तरह कुछ का उपयोग कर क्लिक जोड़ें:

$(element).children(class).each(function(i){ 
    $(this).click(function(){ 
     foo(i); 
    }); 
}); 

परीक्षण नहीं किया गया लेकिन मैं हमेशा इस तरह की संरचना का उपयोग जहां संभव हो।

1

या जैसा कि आप वर्णन करते हैं, बस एक नया फ़ंक्शन बनाएं। यह इस तरह दिखेगा:

function foo(val) { 
    return function() { 
     alert(val); 
    } 
} 

for (var i = 0; i < 3; i++) { 
    $('#button'+i).click(foo(i)); 
} 

मुझे पूरा यकीन है कि मेहरदाद का समाधान काम नहीं करता है। जब आप लोगों को एक अस्थायी चर में कॉपी करते देखते हैं, तो आमतौर पर यह "इस" के मान को सहेजना होता है जो आंतरिक बच्चे के दायरे में भिन्न हो सकता है।

+0

हाँ उसका समाधान काम नहीं करता है, मुझे लगता है कि उसने इसे हटा दिया है। – Rob

+0

यह सबसे अच्छा जवाब है जिसे मैं जानता हूं। बांध के साथ कोड ठीक है, लेकिन वह डेटा पैरामीटर वास्तव में एक बदसूरत हैक है। इस दृष्टिकोण का लाभ यह है कि जब भी आपको यह समस्या हो (यह एक लूप वैरिएबल को संदर्भित करता है) को बंद कर देगा, चाहे आपके पास jQuery हो या नहीं। –

+0

@ जेसन: जबकि मैं मानता हूं कि यह एक अच्छा जवाब है, और निश्चित रूप से उत्तर दिया गया होगा अगर jQuery का उल्लेख नहीं किया गया था और सवाल में टैग किया गया था, तो मुझे इसे "बदसूरत हैक" होने पर असहमत होना है - यह निश्चित रूप से साफ है। साथ ही, अर्ध-समान 'फंक्शन.बिंड' 5 वां संस्करण विनिर्देशन में है, इसलिए आप कह सकते हैं कि सादा ओल' जेएस के लिए सबसे अच्छा जवाब बराबर प्रोटोटाइप विधि होगा जो जेएस के मौजूदा संस्करणों में कार्यक्षमता प्रदान करेगा। http://snipplr.com/view/13987/functionbind/ केवल एक उदाहरण है जो मुझे मिल सकता है, मुझे पता है कि बहुत सारे हैं। –

5

@ एंडी समाधान सबसे अच्छा है। लेकिन आप अपने बंद होने में मूल्य को बचाने में मदद के लिए जावास्क्रिप्ट स्कोपिंग का भी उपयोग कर सकते हैं।

आप अज्ञात फ़ंक्शन निष्पादित करके अपने लूप बॉडी में एक नया दायरा बनाकर ऐसा करते हैं।

for (var i = 0; i < 3; i++) { 
    (function(){ 
    var index = i; 
    $('#button'+index).click(function(){ 
     foo(index); 
    }); 
    })(); 
} 

के बाद से पाश शरीर प्रत्येक यात्रा पर एक नया गुंजाइश है, सूचकांक चर प्रत्येक यात्रा पर सही मान के साथ दोहराया गया है।

+0

धन्यवाद – Rob

6

इस कोड का प्रयास करें:

function foo(val) { 
    alert(val); 
} 

var funMaker = function(k) { 
    return function() { 
    foo(k); 
    }; 
}; 

for (var i = 0; i < 3; i++) { 
    $('#button'+i).click(funMaker(i)); 
} 

कुछ महत्वपूर्ण यहाँ अंक:

  • जावास्क्रिप्ट है समारोह scoped। यदि आप एक नया ('गहरा') गुंजाइश चाहते हैं, तो आपको इसे पकड़ने के लिए एक फ़ंक्शन बनाना होगा।
  • यह समाधान जावास्क्रिप्ट विशिष्ट है, यह jQuery के साथ या उसके बिना काम करता है।
  • समाधान काम करता है क्योंकि i के प्रत्येक मान k रूप में एक नया दायरे में नकल की जाती है और समारोह funMaker से लौटे आसपास k (जो पाश में परिवर्तन नहीं करता है) बंद कर देता है, चारों ओर i नहीं (जो करता है)।
  • आपका कोड काम नहीं करता समारोह है कि आप click को पारित करता है क्योंकि नहीं 'खुद' i, यह पाश में है कि i परिवर्तन इसके निर्माता की i पर बंद, और।
  • उदाहरण funMaker के साथ लिखा गया हो सकता है, लेकिन मैं आमतौर पर चीजों को स्पष्ट करने के लिए ऐसे सहायक कार्यों का उपयोग करता हूं।
  • funMaker का तर्क k है, लेकिन इससे कोई फर्क नहीं पड़ता है, यह किसी भी समस्या के बिना i हो सकता है, क्योंकि यह funMaker फ़ंक्शन के दायरे में मौजूद है।
  • 'पर्यावरण' मूल्यांकन मॉडल की स्पष्ट व्याख्या में से एक सुस्मान & एबेलसन (http://mitpress.mit.edu/sicp/ पूर्ण पाठ ऑनलाइन उपलब्ध नहीं है, आसानी से पढ़ा नहीं गया है) - अनुभाग 3.2 देखें। चूंकि जावास्क्रिप्ट वास्तव में सी सिंटैक्स के साथ योजना है, यह स्पष्टीकरण ठीक है।

संपादित करें: कुछ विराम चिह्न निश्चित करें।

+0

जानने के लिए उपयोगी है जो अंधेरे के उत्तर के समान है, लेकिन कुछ अच्छे प्रदर्शन के साथ। * "जावास्क्रिप्ट वास्तव में सी वाक्यविन्यास के साथ योजना है" * हर बार जब कोई पहली बार इसे समझता है, तो एक जेएस परी अपने पंखों को प्राप्त करता है। –