2011-04-04 17 views
11

क्या कोई मुझे बता सकता है कि मैं यहां क्या गलत कर रहा हूं? मैंने इसे नीचे सरलीकृत किया लेकिन मैं मूल रूप से एक सूची बनाने की कोशिश कर रहा हूं और एक क्लिक ईवेंट है जो लूप में केवल एक चर का संदर्भ देता है।मैं jquery का उपयोग कर किसी अज्ञात फ़ंक्शन में एक चर पैरामीटर कैसे पास कर सकता हूं?

for (var i = 0; i < data.length; i++) {                   
    $newRow = $(rowFormat);      
    $('a:first', $newRow).click(function(i){ 
    return function() { alert(i); } 
    }); 
    $list.append($newRow);  
} 
+0

बात तुमने किया था "गलत" है

उदाहरण 1 बंद कहा जाता है। आपने प्रत्येक क्लिक को वही चर 'i' पर एक प्रतिबिंबित किया है। – ITroubs

+0

@ITroubs: वह इसके बारे में स्पष्ट रूप से जानता था और इसके आसपास काम करने की कोशिश की (वास्तव में, उसने उनमें से किसी भी * को लूप में उपयोग किए गए 'i' के संदर्भ में नहीं दिया था; उसने इसे [बाहरी] अज्ञात में छायांकित किया फ़ंक्शन की तर्क सूची)। वह बस कुछ कोष्ठक भूल गया - डेविड का जवाब देखें। :-) –

+0

हाँ आप सही हैं। कोड को सही ढंग से नहीं पढ़ा ;-) – ITroubs

उत्तर

13

आप बाहरी फ़ंक्शन को कॉल नहीं कर रहे हैं।

$('a:first', $newRow).click(function(j){ 
    return function() { alert(j); } 
}(i)); /* Pay special attention to this line, it is where the major change is */ 

टीजे के रूप में। पाउडर का उल्लेख है, आप कारखाने को लूप से बाहर ले जा सकते हैं।

function my_factory(j) { 
    return function() { 
     alert(j); 
    }; 
} 

$('a:first', $newRow).click(my_factory(i)); 
+0

क्लिक पर अपना स्वयं का तर्क बुलाकर, आप पारित होने वाले ईवेंट तर्क को खो देते हैं। – Eli

+4

+1 @ माइक: आपको कारखाने को स्थानांतरित करने की सलाह होगी लूप से बाहर काम, हालांकि; आप अनावश्यक रूप से अतिरिक्त फैक्ट्री कार्यों का एक समूह बना रहे हैं, जहां आपको केवल एक की आवश्यकता है ('क्लिक' के लिए विभिन्न कार्यों को बनाने के लिए)। प्रत्येक पंक्ति के लिए एक अलग इवेंट हैंडलर बनाने के बजाय ईवेंट प्रतिनिधिमंडल को देखने की भी सिफारिश करेंगे। –

+0

@Eli: यह कोड नहीं कर रहा है। 'J' स्वीकार करने वाला फ़ंक्शन 'क्लिक' हैंडलर नहीं है, यह * क्लिक हैंडलर बनाता है और देता है। 'क्लिक' हैंडलर वह फ़ंक्शन है जो 'अलर्ट' कह रहा है। –

3

आपको लगभग यह मिला है, केवल एक छोटा सा परिवर्तन। यह वास्तव में जावास्क्रिप्ट में बंद होने के व्यावहारिक उपयोग का मेरा पसंदीदा उदाहरण है।

असल में, आपको एक ऐसा फ़ंक्शन बनाना होगा जो मान लेता है, और वह मान देता है जो उस मान का उपयोग करता है। आपका उदाहरण गुम होने के लिए नीचे दी गई टिप्पणी पंक्ति देखें। आपके कोड ने अनाम कार्य बनाया है, लेकिन इसे नहीं बुलाया।

for (var i = 0; i < data.length; i++) {                   
    $newRow = $(rowFormat); 
    var fn = (function (value) { 
    return function() { 
     alert(value); 
    }; 
    }) (i); //this is what you were missing, you need to invoke the anonymous function 
    $('a:first', $newRow).click(fn); 
    $list.append($newRow);  
} 
0

'क्लिक' ईवेंट संलग्न करने और पैरामीटर पास करने के लिए 'बांध' का उपयोग करें। का उपयोग करते हुए 'event.data' आप अपने पैरामीटर का सही मूल्य प्राप्त करने में सक्षम हो जाएगा: 2

$(document).ready(function() 
{ 
    for (var i = 0; i < data.length; i++) 
    {                   
     $newRow = $(rowFormat);      
     $('a:first', $newRow).bind('click', {i: i}, 
      function (event) 
      { 
       alert(event.data.i); 
      } 
     ); 
     $list.append($newRow);  
    } 
}); 

उदाहरण::

$(document).ready(function() 
{ 
    $(".selectorA").each(function() 
    { 
     var elementId = $(this).attr("id"); 

     for(var i = 0; i < 20; i++) 
     { 
      $('#question' + i).bind('click', {currentIndex: i, elementId: elementId}, 
       function (event) 
       { 
        alert(event.data.currentIndex + " | " + event.data.elementId); 
       } 
      ); 
     } 
    } 
}); 
संबंधित मुद्दे

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