2010-01-06 10 views
10
up.addEventListener(MouseEvent.CLICK, 
    function clickFunc(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 
down.addEventListener(MouseEvent.CLICK, 
    function clickFunc(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,-1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 

उपरोक्त कोड कुछ एमसी के लिए श्रोता जोड़ता है। मूल रूप से विधियां अज्ञात थीं लेकिन मैंने उन्हें अपने हटाए गए श्रोता में संदर्भ देने के लिए क्लिक Func() नाम दिया है।एक श्रोता को हटाएं जिसमें एक्शनस्क्रिप्ट 3

यहां मेरा निकालना श्रोता कोड है। इन दोनों स्निपेट अलग-अलग कार्यों में हैं। ऐड श्रोता विधि को हटाने विधि से पहले बुलाया जाता है।

1120: Access of undefined property clickFunc. 

उत्तर

0

इस कोशिश:

up.removeEventListener(MouseEvent.CLICK, clickFunc); 
down.removeEventListener(MouseEvent.CLICK, clickFunc); 

जैसे ही मैंने फिल्म प्रकाशित मैं इस त्रुटि मिलती है

up.addEventListener(MouseEvent.CLICK, 
    clickFunc = function(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 

down.addEventListener(MouseEvent.CLICK, 
    clickFunc = function(event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,-1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 
+0

मैंने पहले से ही कोशिश की है और यह उत्पादन करता है और अतिरिक्त "1120: अपरिभाषित संपत्ति क्लिकफनक" की पहुंच स्वयं पर त्रुटि – ed209

2

यह एक काम करना चाहिए ... बस methode नाम हटाने ...

up.addEventListener(MouseEvent.CLICK, 
     function(event:MouseEvent):void 
     { 
      revealSpinner(event,51.42,1,spinner); 
      event.currentTarget.removeEventListener(event.type, arguments.callee); 
      autoTimer.stop(); 
     }, 
     false, 0, true); 
    down.addEventListener(MouseEvent.CLICK, 
     function(event:MouseEvent):void 
     { 
      revealSpinner(event,51.42,-1,spinner); 
      event.currentTarget.removeEventListener(event.type, arguments.callee); 
      autoTimer.stop(); 
     }, 
     false, 0, true); 
+0

हाँ यह काम करता है, लेकिन मुझे घटना के श्रोता को "ऊपर" और "नीचे" दोनों से हटा देना होगा आप किस पर क्लिक करते हैं। आपका सुझाव ईवेंट कॉल removeEventListener() की आवश्यकता को हटा देगा क्योंकि यह क्लिक कार्रवाई का हिस्सा है। मुझे श्रोता को बाहरी श्रोता से बाहर निकालना होगा। – ed209

+2

एकमात्र तरीका मैं सोच सकता हूं कि दोनों कार्यों को स्थानीय चरों में असाइन करना है, श्रोताओं को जोड़ने के लिए उनका उपयोग करें, और उन दो वर्रों को ऑब्जेक्ट के रूप में वापस करें और वैश्विक चर में उस ऑब्जेक्ट को स्टोर करें। अब, 'globalObj.upFunction' और' globalObj.downFunction' का उपयोग करके दोनों फ़ंक्शंस से श्रोता को हटाएं। लेकिन इससे पहले कि आप इस के लिए कोड लिखना शुरू करें, मैं दृढ़ता से सुझाव देता हूं कि आप अज्ञात/आंतरिक कार्यों के बजाय इंस्टेंस विधियों का उपयोग करने पर विचार करें। – Amarghosh

5

सबसे पहले, आपके पास एक ही नाम दो बार उपयोग किया जाता है (clickFunc), इसका अनुमान नहीं लगाया जा सकता है जिसे आप निकालने के लिए अपनी कॉल में संदर्भित करते हैं। सभी का दूसरा, clickFunc केवल समारोह में एक्सेस किया जा सकेगा जहां यह घोषित किया जाता है:

function foo() { 
    var clickFunc: Function; 
    up.addEventListener(MouseEvent.CLICK, 
     clickFunc = function (event:MouseEvent):void 
     { 
      revealSpinner(event,51.42,1,spinner); 
      event.currentTarget.removeEventListener(event.type, arguments.callee); 
      autoTimer.stop(); 
     }, 
     false, 0, true); 

    // 'clickFunc' available here, so this is possible: 
    up.removeEventListener(MouseEvent.CLICK, clickFunc); 
} 

function bar() { 
    // 'clickFunc' is not available here, so this is not possible: 
    up.removeEventListener(MouseEvent.CLICK, clickFunc); 
    // 1120: Access of undefined property clickFunc 
} 

आप (, कहते हैं उन्हें एक घटना से निकालने की तरह,) तरीकों को संदर्भित करने की जरूरत है, वे गुमनाम नहीं हो सकता। यदि आपको उन्हें कई विधियों से संदर्भित करने की आवश्यकता है, तो उन्हें एक विधि के लिए स्थानीय नहीं होना चाहिए (ऊपर दिए गए उदाहरण में foo)। और यदि आप करेंगे तो उन्हें अलग-अलग पहचानकर्ताओं (clickFunc1 और clickFunc2 की आवश्यकता होगी)। यह मेरा सुझाई गई समाधान है:

private function addHandlers(): void 
{ 
    up.addEventListener(MouseEvent.CLICK, upClickHandler, false, 0, true); 
    down.addEventListener(MouseEvent.CLICK, downClickHandler, false, 0, true); 
} 

private function removeHandlers(): void 
{ 
    up.removeEventListener(MouseEvent.CLICK, upClickHandler); 
    down.removeEventListener(MouseEvent.CLICK, downClickHandler); 
} 

private function upClickHandler(event:MouseEvent):void 
{ 
    revealSpinner(event,51.42,1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 

private function downClickHandler(event:MouseEvent):void 
{ 
    revealSpinner(event,51.42,-1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 
बेशक

, अगर, अपने उदाहरण की तरह, तरीकों समान हैं आप उपयोग कर सकते हैं केवल एक:

private function addHandlers(): void 
{ 
    up.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true); 
    down.addEventListener(MouseEvent.CLICK, clickHandler, false, 0, true); 
} 

private function removeHandlers(): void 
{ 
    up.removeEventListener(MouseEvent.CLICK, clickHandler); 
    down.removeEventListener(MouseEvent.CLICK, clickHandler); 
} 

private function clickHandler(event:MouseEvent):void 
{ 
    revealSpinner(event,51.42,-1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 
3

ठीक कुछ तरीके है कि आप क्या कर सकते हैं वहाँ इस। यहां पहला तरीका है जो मुझे लगता है कि आप क्या चाहते हैं।

var upAnon:Function; 
var downAnon:Function; 

up.addEventListener(MouseEvent.CLICK, 
    upAnon = function (event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 
down.addEventListener(MouseEvent.CLICK, 
    downAnon = function (event:MouseEvent):void 
    { 
     revealSpinner(event,51.42,-1,spinner); 
     event.currentTarget.removeEventListener(event.type, arguments.callee); 
     autoTimer.stop(); 
    }, 
    false, 0, true); 

up.removeEventListener(MouseEvent.CLICK, upAnon); 
down.removeEventListener(MouseEvent.CLICK, downAnon); 

और यहां एक और तरीका है, वही वांछित प्रभाव और कार्यक्षमता पहले के रूप में प्राप्त करना। बस क्लीनर और आमतौर पर मानक अभ्यास।

function upFunction(event.MouseEvent):void { 
    revealSpinner(event,51.42,1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 
function downFunction(event.MouseEvent):void { 
    revealSpinner(event,51.42,-1,spinner); 
    event.currentTarget.removeEventListener(event.type, arguments.callee); 
    autoTimer.stop(); 
} 

up.addEventListener(MouseEvent.CLICK, upFunction, false, 0, true); 
down.addEventListener(MouseEvent.CLICK, downFunction, false, 0, true); 

up.removeEventListener(MouseEvent.CLICK, upFunction); 
down.removeEventListener(MouseEvent.CLICK, downFunction); 

कारण यह है कि आप पहले प्रकार का प्रयोग करेंगे, यदि आप एक समारोह के अंदर eventhandler बनाने और, कि समारोह में परिभाषित चर का उपयोग करने के लिए अपने गुमनाम समारोह के अंदर की जरूरत किया गया है। उदाहरण के लिए, मैं एनन फ़ंक्शन के अंदर var countMe तक पहुंच रहा हूं और माउस_डाउन पर इसे बढ़ा रहा हूं, और यह माउस_अप सक्रिय होने तक बढ़ेगा। इसलिए हर बार जब मैं नीचे क्लिक करता हूं, तो यह 0 से ऊपर तक गिना जाएगा जब तक माउस ऊपर नहीं होगा, फिर शुरू हो जाएगा। (है कि पिछले पैरामीटर के लिए सच गुजर)

var anonFunc:Function; 

function doThisStuff(event:MouseEvent):void { 
    var countMe = 0; 

    stage.addEventListener(Event.ENTER_FRAME, 
     anonFunc = function (e:Event) { 
      countMe++; 
      trace(countMe); 
     } 
    ); 
} 

function stopCounting(event:MouseEvent):void { 
    stage.removeEventListener(Event.ENTER_FRAME, anonFunc); 
} 

stage.addEventListener(MouseEvent.MOUSE_DOWN, doThisStuff); 
stage.addEventListener(MouseEvent.MOUSE_UP, stopCounting); 
2

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

आपको उन ईवेंट हैंडलर के दायरे में एक संदर्भ बनाए रखना होगा जो अभी भी मौजूद होने पर मौजूद होगा। एक बार ऐसा करने के बाद, आप उन्हें हटाने के लिए उन संदर्भों का उपयोग करने में सक्षम होना चाहिए।

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