所以,有一种简单的方法可以像这样从容器中删除所有孩子
while (container.numChildren)
{
container.removeChildAt(0);
}
有没有办法以复数形式删除 stage.eventListener(不知道我是否使用了正确的词),比如 stage.eventListeners?类似的东西?
谢谢!
所以,有一种简单的方法可以像这样从容器中删除所有孩子
while (container.numChildren)
{
container.removeChildAt(0);
}
有没有办法以复数形式删除 stage.eventListener(不知道我是否使用了正确的词),比如 stage.eventListeners?类似的东西?
谢谢!
不,没有。至少没有公开可用的机制来跟踪事件侦听器。但是,你可以自己做。
基本上,您需要跟踪添加的每个侦听器。最简单的方法是扩展您想要执行此操作的类并覆盖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
属性添加到正在保存的对象并检查它,但老实说,我从未将该属性设置为默认值,因此我没有将其包含在我的代码中
在 FlashPlayer 11 中,DisplayObjectContainer
支持removeChildren
删除所有子项的功能。所以你可以用你的while循环替换container.removeChildren()
至于删除所有 eventListener,没有内置方法。但是,您可以自己编写一些东西来跟踪添加到特定对象的所有侦听器,从而允许您通过循环遍历集合来删除它们。
不幸的是,简短的回答是这是不可能的。默认情况下,事件调度程序不会公开跟踪注册的侦听器。因此,您不能遍历某些列表并将它们全部删除。
您必须记住自己添加的听众。
有一个非常简单的解决方案,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 信号的教程: