所以,有一种简单的方法可以从像
这样的容器中删除所有孩子while (container.numChildren)
{
container.removeChildAt(0);
}
有没有办法删除复数的stage.eventListener(不知道我是否使用右词),像stage.eventListeners?类似的东西?
谢谢!
答案 0 :(得分:3)
不,没有。没有机制,至少是公开可用的,跟踪事件监听器。但是,你可以自己做。
基本上,您需要跟踪添加的每个侦听器。最简单的方法是扩展您要执行此操作的类并覆盖addEventListener()
。
private var listeners:Vector.<Object>;
override public function addEventListener( type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ):void {
var obj:Object = {
type : type,
listener : listener
};
this.listeners.push( obj );
super.addEventListener( type, listener, useCapture, priority, useWeakReference );
}
override public function removeEventListener( type:String, listener:Function, useCapture:Boolean = false ):void {
var i:Number, l:Number;
l = this.listeners.length;
for ( i = 0; i < l; i++ ) {
if ( this.listeners[i].type == type && this.listeners[i].listener == listener ) {
this.listeners.splice( i, 1 );
break;
}
}
super.removeEventListener( type, listener, useCapture );
}
public function removeAllEventListeners():void {
var i:Number, l:Number;
l = this.listeners.length;
for ( i = 0; i < l; i++ ) {
super.removeEventListener( this.listeners[i].type, this.listeners[i].listener );
}
this.listeners.splice( 0, this.listeners.length ); //empties the vector
}
如果扩展某个类不适合您(因为您使用的是带有时间轴的Flash Pro,或者它是您需要从中删除所有事件侦听器的阶段),您可以在每次使用时手动将其添加到Vector中添加一个事件监听器。它不像我上面描述的那样简单,但它仍然可以工作。
请注意,您应该将useCapture
属性添加到正在保存的对象中并检查它,但我老实说从未将该属性设置为除默认值之外的任何属性,因此我没有将其包含在我的代码
答案 1 :(得分:0)
在FlashPlayer 11中,DisplayObjectContainer
支持删除所有子项的removeChildren
函数。因此,您可以使用container.removeChildren()
至于删除所有eventListeners,没有内置的方法。但是,您可以自己编写一些内容来跟踪添加到特定对象的所有侦听器,允许您通过循环遍历集合来删除它们。
答案 2 :(得分:0)
不幸的是,简短的回答是,这是不可能的。默认情况下,事件调度程序不会公开跟踪注册的侦听器。因此,您无法遍历某些列表并将其全部删除。
您必须记住自己添加的听众。
答案 3 :(得分:0)
有一个非常简单的解决方案,Robert Penner的非凡信号库。这是一个例子:
import org.osflash.signal.Signal;
public class Rocket()
{
// Signals are used to dispatch messages to interested parties
public var enginesFiredSignal:Signal;
public function Rocket()
{
// You have to instantiate the signal for it to do anything
enginesFiredSignal = new Signal();
}
public function fireEngines():void
{
// Dispatch will notify any interested parties
enginesFiredSignal.dispatch();
}
public function dispose():void
{
// This is the magic call... it removes *all* interested parties.
// No need to iterate through them and removeEventListeners.
enginesFiredSignal.removeAll();
}
}
public class Academy()
{
public var rocket:Rocket;
public function Academy()
{
rocket = new Rocket();
// We are interested to know *when* the engines fire,
// so we "add" ourself to the Signal.
rocket.enginesFiredSignal.add( enginesFiredHandler );
// This call will force the Signal to do its thing
rocket.fireEngines();
// Disposing of the Rocket will automatically remove us from
// its Signal. No further event removal or maintenance required.
rocket.dispose();
}
public function enginesFiredHandler():void
{
trace( "engines were fired" );
}
}
你可以在方式之外进行参数传递和各种有趣的事情。我建议你看看他的博客。
http://flashblog.robertpenner.com
以下是如何开始使用AS3信号的教程: