从as3中删除ENTER_FRAME EventListener

Raj*_*Das 3 flash actionscript-3

这是我在主类中的Flash/AS3中的代码.

addEventListener(Event.ENTER_FRAME,function(e:Event){

        if(findObject == true){
            // I want to remove this ENTER FRAME
        }

});
Run Code Online (Sandbox Code Playgroud)

mgr*_*aph 13

试试这个:

e.currentTarget.removeEventListener(e.type, arguments.callee)
Run Code Online (Sandbox Code Playgroud)


小智 5

  1. 你不应该在上面的代码中做你做的事情.

  2. 如果currentTarget事件中没有removeEventListener()方法(可能,但非常不可能),mgraph的代码很可能无法像宣传的那样工作.从编译器的角度来看,虽然您将尝试动态解析一个易于出错的通用对象上的方法,但应小心处理.这是危险的,因为它表明程序员"不知道"她期望通过假设处理和工作的对象是什么样的.假设对于找到解决方案很有帮助,但对于实现解决方案同样不好.

如果你想以你的方式优化某些东西,那么,只是FYI这实际上在符号表(在编译的SWF文件中)中创建了一个唯一的(冗余)名称,这会导致更糟糕的SWF压缩.

如果您在实验中这样做,这很好,但您应该避免在现实生活中的代码.

还有一点需要注意:与true常数的比较是100%无用的.如果这样的比较完全有意义(即findObject可以false随时评估),那么if (findObject) { ... }等同但是代码的缩短版本.最后,希望匿名函数缺少返回类型声明.除了您将收到编译器警告之外,它在您的示例中不会发生太大变化.一般来说,省略类型声明是一种糟糕的风格.

编辑

public function addEventListener(type:String, listener:Function ...):void
{
    this._listeners[type].push(listener);
}

public function dispatchEvent(event:Event):void
{
    for each (var listener:Function in this._listeners[event.type])
        listener(event);
}

public function removeEventListener(type:String, listener:Function, ...):void
{
    delete this._listeners[type][listener];
}
Run Code Online (Sandbox Code Playgroud)

假设您实际上想要实现IEventDispatcher(而不是使用另一个EventDispatcher - 您可能有理由这样做,原因之一是本机EventDispatcher生成大量短期对象 - 事件,您可能希望减少它.)但是没有办法,你可以复制你的代码event.target或event.currentTurget,因为你不能访问拥有该方法的对象,所以,你会离开这一点.

另一个例子:

public class SomeEvent extends Event
{

    private var _target:NotEventDispatcher;

    public function SomeEvent(type:String, someTarget:NotEventDispatcher)
    {
        super(type);
        this._target = someTarget;
    }

    public override function get target():Object
    {
        return this._target;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在现实世界中实际看到的东西,这在Mate或类似框架中用于"匿名"将所有事件调度程序连接到某个"母舰事件调度程序"的单个静态实例.

我不一定证明这种方法是合理的,但从技术上讲,没有什么能阻止你做其中任何一种方法.我在上面的帖子中说的是,在某些情况下,语言会向你承诺,例如,如果你这样做:

var dispatcher:IEventDispatcher;
try
{
    dispatcher = IEventDispatcher(event.currentTarget);
    // now you can be sure this object has removeEventListener
    dispatcher.removeEventListener(event.type, arguments.callee);
}
catch (error:Error)
{
    // but what are you going to do here?
}
Run Code Online (Sandbox Code Playgroud)

但最常见的情况是你订阅冒泡事件,在这种情况下,你不知道你是否要取消订阅event.target或event.currentTtarget - 因为你不知道你在听哪一个至.