2009-09-21 93 views
9

有沒有辦法確定哪些事件監聽器用顯示對象註冊?我想從顯示對象中刪除所有事件偵聽器,以便我可以根據應用程序中的上下文更改分配新事件偵聽器。如何從顯示對象中刪除所有事件偵聽器?

+0

基本上這一個愚弄的人,記錄今天早些時候:http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting已註冊的聽衆列表 – Glenn 2009-09-21 03:20:08

+2

但是最簡單的答案是你必須使用散列圖或其他東西來管理你自己的。 – Glenn 2009-09-21 03:20:43

回答

7

jeceuyper是正確的...

側沒有,但:DisplayObject擴展EventDispatcher,它已經確實實現IEventDispatcher ...所以更準確地說:你需要重寫addEventListenerremoveEventListener跟蹤偵聽器...

一些技術細節:我建議你使用Dictionary來存儲處理函數...有點慢插入,但要快得多去除...還,Dictionary支持弱引用,這是相當重要的在處理事件的情況下......也請記住,那useCapture允許添加同一個處理器的兩倍......

好運氣,然後...;)

+0

感謝您指出back2dos! – jdecuyper 2009-09-21 13:31:46

4

Glenn是對的,沒有removeAllListener或listAllListener方法。不過,你可以讓你的custum diplayObject實現接口並跟蹤所有添加或從你的對象中刪除的監聽器。

8

back2dos提到你應該使用的方法,我所做的是擴展MovieClip類並實現各種功能我每天都在使用,但不屬於動畫片段課程的一部分。包括覆蓋了的addEventListener類

protected var listeners : Dictionary = new Dictionary(); 
override public function addEventListener(type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = true) : void 
{ 
     var key : Object = {type:type,useCapture:useCapture}; 
     if(listeners[ key ]) { 
       removeEventListener(type, listeners[ key ], useCapture); 
       listeners[ key ] = null; 
     } 
     listeners[ key ] = listener; 

     super.addEventListener(type, listener, useCapture, priority, useWeakReference); 
} 
protected function removeListeners() : void 
{ 
     try 
     { 
      for (var key:Object in listeners) { 
        removeEventListener(key.type, listeners[ key ], key.useCapture); 
         listeners[ key ] = null; 
      } 
     }catch(e:Error){} 
} 
+0

...除了整合型進鍵,但不包含函數指針意味着你只能在對象上給定類型的一個聽衆。要允許多個偵聽器,可以將偵聽器函數指針添加到鍵對象,並將該鍵設置爲某個虛擬值(例如1)。 – 2012-09-16 12:16:34

2

這有點一個黑客攻擊的,但在一些(也許是大多數情況下),你可以輕鬆地設置顯示對象爲null,重新初始化,然後重新配置它零視覺中斷。

這有助於刪除所有事件偵聽器。

除非你是在已經有數百位聽衆和對象就應該完全正常工作,只要你能容忍重新配置顯示對象的應用程序這樣做。

很顯然,你不應該這樣做的任何事情是做一些像加載數據構造瘋了。

-1
function a(){ 
    mc.addEventListener(Event.ENTER_FRAME,function(){ 
         ... 
         } 
} 

function b(){ 
    mc.removeEventListener(Event.ENTER_FRAME,function(){}); 
} 

作品...

+0

請仔細閱讀該問題。我問如何從一個對象中刪除所有的事件監聽器。 – Soviut 2012-02-10 11:12:43

+0

我其實只是看着這個問題來解決這個問題。 – andychase 2012-04-09 05:56:38

+0

這將無法正常工作 - 內'函數創建B'匿名事件處理函數是一個不同的對象不是'功能了'中創建的匿名事件處理函數。因此,'removeEventListener'調用將無提示失敗。 – ericsoco 2014-03-02 19:14:02

相關問題