2009-09-28 7 views
11

मैं यह जानने का प्रयास कर रहा हूं कि jQuery के क्लिक() ईवेंट के दौरान बनाए गए कार्यों में बाहरी चर मूल्यों को कैसे संग्रहीत किया जाए। यहां कोड का एक नमूना है जिसका मैं अभी काम कर रहा हूं।jQuery क्लिक में स्थानीय चर को कैसे स्टोर करें?

for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click(function(){ 
     var gid = i; 
     alert(gid); 
    }); 
} 

<div id="tmpid0">1al</div> 
<div id="tmpid1">asd</div> 
<div id="tmpid2">qwe</div> 

तो क्या हो रहा है कि घटनाओं को ठीक से संलग्न हैं, लेकिन 'gid' का मान हमेशा 'मैं' के अंतिम वृद्धि मूल्य है। मुझे यकीन नहीं है कि इस स्थिति में निजी चर कैसे स्थापित करें।

उत्तर

22

आप बंद कर सकते हैं और बंद होने के स्थानीय चर में i असाइन कर सकते हैं। gid वैरिएबल को उस बिंदु पर i का मान सौंपा जाएगा कि फ़ंक्शन चलाने के बजाए बंद किया गया था।

for(var i=0; i<3; i++){ 
    (function() { 
     var gid = i; 
     $('#tmpid'+i).click(function(){ 
      alert(gid); 
     }); 
    })(); 
} 
+0

यह मेरे लिए काम करता था। यह एक अज्ञात समारोह का एक दिलचस्प उपयोग है। – Geuis

+0

क्या यह है? मैं जावास्क्रिप्ट के लिए बिल्कुल नया हूं, लेकिन मेरी Greasemonkey स्क्रिप्ट्स में कुछ JQuery loops हैं और यह –

+0

कार्यों को संभालने का एक प्राकृतिक तरीका प्रतीत होता है। मैंने पहले इस पैटर्न को देखा है, पहली बार मैं वास्तव में कितना उपयोगी था में भाग गया। –

1

आपने एक बंद कर दिया है, जहां चर "i" एकाधिक क्लिक हैंडलर के बीच साझा किया जाता है।

के बाद से जावास्क्रिप्ट ब्लॉक गुंजाइश नहीं है, तो आप "मैं" एक नया कार्य तो यह एक नया उदाहरण में कॉपी किया-दर-मूल्य है करने के लिए उत्तीर्ण करनी होगी:

function bindStuff(i) { 
    $('#tmpid'+i).click(function(e){ 
        var gid = i; 
        alert(gid); 
      }); 
} 

for(var i=0; i<3; i++){ bindStuff(i); } 

यहाँ एक और इसी तरह के सवाल है : JavaScript closure inside loops – simple practical example

+0

किसी कारण से मुझे यह काम मेरे लिए नहीं मिल सकता है। मुझे अभी भी मूल समस्या है। – Geuis

+0

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

0

मैं jQuery के मूल डेटा() विधि पर बैक अप पढ़ता हूं। मैंने इसे कार्यान्वित किया और यह भी काम करता है। बंद करने के तरीके को कैसे प्रबंधित किया जा रहा है इसकी वास्तविक कार्यक्षमता में से कुछ छुपा रहा है, लेकिन इसे लागू करने के लिए इसकी सरल और सुंदर साफ है।

2
for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click((function(gid){ 
     return function(){ 
      alert(gid); 
     } 
    })(i)); 
} 

ऐसा करने के कई तरीके हैं, यह एक काम करता है और आसान दिखता है।

संपादित

एक और तरीका:

for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click([i],function(e){ 
     alert(e.data[0]); 
    }); 
1

वैकल्पिक रूप से, jQuery के लिए क्लिक करें (या बाँध) के पहले तर्क एक वस्तु है कि डेटा के रूप में घटना से जुड़ी हो जाता है।

for(var i=0; i<3; i++){ 
    $('#tmpid'+i).click({gid : i}, function(e) { 
     alert(e.data.gid); 
    }); 
} 

मुझे यह बंद करने के समाधान की तुलना में थोड़ा और अधिक पठनीय लगता है, लेकिन यह स्वाद के लिए आता है।

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