2013-10-14 48 views
0

我傳遞一些參數,每次我點擊一個影片剪輯事件的功能,而我並沒有意識到如何刪除它刪除傳遞參數

my_mc.addEventListener(MouseEvent.CLICK, someFunct(1,1)); 

我想這可能是工作,但它不是工作...

my_mc.removeEventListener(MouseEvent.CLICK, someFunct) 
+0

什麼是你得到的錯誤。相反,你覺得應該起作用的是什麼不工作。順便說一句,addEventListener中的'someFunct(1,1)'和removeEventListener中的'someFunct'似乎很腥! – catholicon

+0

沒有錯誤,它只是不會刪除監聽器... – user2624407

回答

0

我不認爲你張貼的語法實際工作,除非someFunct自己返回一個函數,它是實際的事件監聽器(例外的是,Flex有某些引擎蓋下的東西,會產生幻覺,你可以做到這一點)。無論如何,如果這個功能是以發佈的方式進行遠程工作的話,你所擁有的或多或少是一個匿名功能。

您可以刪除匿名函數的唯一位置是在偵聽器中。但是,偵聽器必須具有更常規的事件偵聽器簽名(具有單個參數即事件)。假設在你的代碼的某處有某人看起來像:

protected function someFunct(param1:int, param2:int):void { 
    return function(e:MouseEvent):void { 
     e.target.removeEventListener(e.type, arguments.callee); 
     trace('in listener', param1, param2); 
    } 

}

如果你正在使用Flex,我不認爲有一種方式來獲得的匿名函數創建哪裏讓聽者是除去。有關這些東西的工作原理,請閱讀this

+0

ofc它會返回一個函數...但我正在尋找一種方法來刪除那個沒有很多工作的監聽器D: – user2624407

+0

您需要如果您想將其從偵聽器本身之外移除,請使用命名函數而不是匿名函數。或者你可以銷燬my_mc並將其從舞臺上移除。當它被垃圾收集時,關閉也是如此。 –

0

我做了一些測試,並想出瞭如何做到這一點。下面是一個測試.as主文件,只是將它作爲新的.fla文件的主要文檔類並運行它。你可以清楚地看到它的工作。至於你的例子,你可以用movieclip替換這個.stage。

package { 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 

public class Main extends MovieClip { 
    public function Main() { 
     graphics.beginFill(0x000000, 1); 
     this.stage.addEventListener(MouseEvent.CLICK, someFunct(1, 1)); 
    } 
    private function someFunct(p1:int, p2:int):Function { 
     return someFunct2 
    } 
    private function someFunct2(event:MouseEvent):void { 
     graphics.drawCircle(this.stage.mouseX, this.stage.mouseY, 50); 
     this.stage.removeEventListener(MouseEvent.CLICK, someFunct2) 
    } 
} 
} 

如果沒有回答你的問題,請評論背部,或編輯你的問題,明確你真正想要的。謝謝

1

Try stopImmidiatePropagation();它會停止所有的錯誤

希望它會幫助