7

मेरे पास एक तीन-चरणीय प्रक्रिया है जो जावास्क्रिप्ट और अजाक्स पर डेटा लोड करने और प्रक्रिया को एक चरण से अगले चरण तक पूरी तरह से निर्भर करती है। मामलों को और जटिल बनाने के लिए, चरणों के बीच संक्रमण (आगे और पिछड़ा) एनिमेटेड है :-(। प्रक्रिया के माध्यम से उपयोगकर्ता की प्रगति के रूप में एंकर वर्तमान चरण और पिछले चरणों को दिखा रहा है। यदि वे पिछले चरण पर क्लिक करते हैं, तो यह उन्हें वापस ले जाता है पिछले चरण।जावास्क्रिप्ट में तत्वों के एक ऐरे में तर्क के साथ इवेंट हैंडलर को कैसे जोड़ें?

अभी, पूरी प्रक्रिया (आगे और पीछे) सही तरीके से काम करती है, यदि आप चरण 1 से शुरू करते हैं, लेकिन यदि आप सीधे चरण 3 पर कूदते हैं तो चरण 1 और चरण 2 के लिए एंकर भी वही करते हैं चरण 3 के रूप में कार्रवाई 3.

यह कोड का वह हिस्सा है जो उपयोगकर्ता के चालू चरण तक सभी चरणों के माध्यम से लूप करता है और प्रत्येक एंकर को बदले में प्रदर्शित करता है और क्लिक ईवेंट पर उपयुक्त फ़ंक्शन निर्दिष्ट करता है:

for (var i = 0; i < profile.current + 1; i++) { 
    if ($('step_anchor_' + i).innerHTML.empty()) { 
     var action = profile.steps[i].action; 
     var dao_id = profile.steps[i].dao_id; 

     $('step_anchor_' + i).innerHTML = profile.steps[i].anchor; 
     $('step_anchor_' + i).observe('click', function(){ 
      pm.loadData(action, dao_id, true); 
     }); 

     Effect.Appear('step_anchor_' + i, { 
      duration: 1, 
      delay: (down_delay++) 
     }); 
    } 
} 

मुझे पता है कि समस्या यह है कि कार्रवाई और दाओ_आईडी पैरामीटर पारित किए जा रहे हैं। मैंने प्रोफाइल को पास करने का भी प्रयास किया है। चरण [i] .action और profile.steps [i] .dao_id लेकिन में उस मामले में प्रोफाइल और मैं या कम से कम मैं दायरे से बाहर हूं।

मैं इसे कैसे बना सकता हूं ताकि मैं प्रत्येक चरण के लिए कार्रवाई और dao_id के लिए पैरामीटर असाइन कर सकूं? (यदि इससे कोई फर्क पड़ता है तो हम प्रोटोटाइप और स्क्रिप्टैकुलस का उपयोग कर रहे हैं)

उत्तर

7

आपकी क्लोजर स्कोप श्रृंखला आपकी समस्याओं का कारण बन रही है। हैंडलर फ़ंक्शन इनलाइन घोषित करके, आपने एक बंद कर दिया है। जाहिर है आपने लूप का लाभ उठाने के लिए ऐसा किया था।

हालांकि, चूंकि आपने बंद कर दिया है, इसलिए आप क्लोजर स्कोपिंग नियमों द्वारा खेल रहे हैं। वे नियम बताते हैं कि मूल कार्य के भीतर स्थानीय चर सक्रिय रहते हैं और बंद होने तक उपलब्ध होते हैं।

आप पास करने की कोशिश कर रहे हैं और फिर अपने बंद करने के लिए "कार्रवाई" और "दाओ_आईडी" का उपयोग कर रहे हैं, लेकिन आप यहां संदर्भों को पारित कर रहे हैं, मानों पर नहीं। तो जब आपके बंद होने (हैंडलर) को बुलाया जाता है तो वे उस मान का उपयोग करते हैं जिसे संदर्भ अंतिम रूप दिया गया था। आपके मामले में, चरण 3 हैंडलर।

क्लोजर स्कोपिंग नियम पर्याप्त भ्रमित हैं, लेकिन आप इस तथ्य से भ्रमित भी हो सकते हैं कि लूप ब्लॉक निष्पादित होने के बावजूद "कार्रवाई" और "दाओ_आईडी" अभी भी जिंदा हैं। खैर, जावास्क्रिप्ट में ब्लॉक स्कोप जैसी कोई चीज नहीं है। एक बार जब आप एक चर घोषित करते हैं तो यह फ़ंक्शन के अंत तक या जब तक इसे हटाया जाता है तब तक उपलब्ध नहीं होता है। जो भी पहले आता है।

जो भी कहा गया है, आपको स्कोप श्रृंखला तोड़ने की जरूरत है।

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

for (var i = 0; i < profile.current + 1; i++) { 
    if ($('step_anchor_' + i).innerHTML.empty()) { 
     var action = profile.steps[i].action; 
     var dao_id = profile.steps[i].dao_id; 

     $('step_anchor_' + i).innerHTML = profile.steps[i].anchor; 
     $('step_anchor_' + i).observe('click', function(a, b){ 
       return function(){pm.loadData(a, b, true)}; 
     }(action, dao_id)); 

     Effect.Appear('step_anchor_' + i, { 
       duration: 1, 
       delay: (down_delay++) 
     }); 
    } 
} 

या इस: यहाँ करने के लिए दो तरीके हैं

function createHandler(action, dao_id) { 
    return function(){pm.loadData(action, dao_id, true);}; 
} 

/* snip - inside some other function */ 
for (var i = 0; i < profile.current + 1; i++) { 
    if ($('step_anchor_' + i).innerHTML.empty()) { 
     var action = profile.steps[i].action; 
     var dao_id = profile.steps[i].dao_id; 

     $('step_anchor_' + i).innerHTML = profile.steps[i].anchor; 
     $('step_anchor_' + i).observe('click', createHandler(action, dao_id)); 
     Effect.Appear('step_anchor_' + i, { 
       duration: 1, 
       delay: (down_delay++) 
     }); 
    } 
} 
+0

यह लगभग कि मैं क्या :-(हालांकि जरूरत है ऐसा करने के लिए लगता है, अब यह करने के लिए घटना का कारण बनता है आग दो बार और यह स्वचालित रूप से स्वचालित रूप से खुद को उतारती है। –

+0

सबसे पहले, सुनिश्चित करें कि आप केवल एक बार लूप को बुला रहे हैं। इसके अलावा, "अनलोड खुद" से आपका क्या मतलब है? यह घटना फिर से आग नहीं होगी? – Benry

+0

मैं केवल यही चाहता हूं कि मैं अधिक upvotes था ... धन्यवाद एक टन।अब मैं शर्मिंदा हूं कि यह सोचने के लिए कि मैंने अपने सिर को कितना समय तक समझने की कोशिश की। –

0

सबसे पहले, क्लिक ईवेंट में अपना निष्पादन दायरा याद रखें। इस संदर्भ में यह कीवर्ड उस पर क्लिक किया गया तत्व को संदर्भित करता है। क्या कोई तरीका है कि आप उस तत्व से dao_id को निर्धारित कर सकते हैं जिस पर क्लिक किया गया है?

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