कैसे जावास्क्रिप्ट में तत्वों की किसी सरणी के लिए तर्क के साथ इवेंट हैंडलर जोड़े के लिए?

वोट
7

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

अभी, पूरी प्रक्रिया (आगे और पीछे) सही ढंग से काम करता है, यदि आप चरण 1 में शुरू हो, लेकिन यदि आप तो चरण 3 चरण 1 और चरण 2 के लिए लंगर सीधे कूद भी चरण 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++)
        });
    }
}

मुझे पता है कि समस्या रास्ते में निहित है कि कार्रवाई और dao_id मानकों में पारित कर दिया जा रहा है। मैं भी profile.steps [i] .action और profile.steps [i] .dao_id लेकिन इस मामले में दोनों प्रोफ़ाइल और मैं गुजर की कोशिश की है या कम से कम मैं बाहर गुंजाइश है।

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

24/11/2008 को 21:19
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

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

24/11/2008 को 21:38
का स्रोत उपयोगकर्ता

वोट
7

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

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

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

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

सब ने कहा, आप गुंजाइश श्रृंखला को तोड़ने की जरूरत है। यहाँ ऐसा करने के लिए दो तरीके हैं:

इसे इस्तेमाल करे:

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++)
        });
    }
}
24/11/2008 को 22:31
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more