actionscript-3 - addEventListener(和 removeEventListener)是否堆栈?

标签 actionscript-3

鉴于以下情况:

object.addEventListen(eventType01,handler01);
object.addEventListen(eventType01,handler01);

object.removeEventListener(eventType01,handler01);

对象上有多少 eventType01 的事件监听器?一还是零?

最佳答案

零。如果您调用 addEventListener,则在第一次“静默失败”之后的所有后续调用中多次使用完全相同的参数。根据需要多次调用 add ,但单个 remove 将清除监听器。

编辑:要记住的另一件事是,除了不必要的性能开销外,在同一个对象上调用多个相同的 removeEventListener() 函数没有任何惩罚。不会发生 fatal error ,它只会“静默失败”,就像重复相同的 addEventListener 调用一样。

编辑2:回答@ThomasM::如果您的听众“触发两次”,那么您没有完全相同的听众。试着把这个快速而肮脏的代码放在一个 fla 的第 1 帧上,这个 fla 有一个小时候的方形影片剪辑:

import flash.events.*
function foo(e):void{
    trace("hi");
}

this.addEventListener(MouseEvent.CLICK,foo);
this.addEventListener(MouseEvent.CLICK,foo);
this.addEventListener(MouseEvent.CLICK,foo);

请注意,单击影片剪辑时的输出正是一个跟踪操作。

现在将此行添加到代码的末尾
this.removeEventListener(MouseEvent.CLICK,foo);

即使您将 foo 添加为单击 3 次的监听器,此调用也会完全杀死监听器。

因此,如果您遇到“同一个监听器”触发两次的问题,那么您正在做的可能是这样的:
this.addEventListener(MouseEvent.CLICK, function(e){
    trace("hi");
});

this.addEventListener(MouseEvent.CLICK, function(e){
    trace("hi");
});

这肯定会“触发两次”,因为监听器功能 不一样 .它们执行相同的操作,但它们不引用内存中的相同位置。它们不指向同一个函数对象。此外,这是非常糟糕的做法,因为您无法实际删除这些监听器。你会怎么做?你没有引用他们。

关于actionscript-3 - addEventListener(和 removeEventListener)是否堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5824761/

相关文章:

JavaScript 事件模型

php - actionscript 3.0 是否强大到足以最终成为我唯一的服务器端语言?

apache-flex - 如何解压缩使用 ByteArray.compress 创建的 zlib 文件?

actionscript-3 - 除了 Flash 之外的其他运行时中的 ActionScript 3?

apache-flex - 如何在运行时从 xsd 模式转到 Actionscript 对象 (Flex)?

flash - Action 3 init()

actionscript-3 - 管理数据、类或数组的首选方式?

actionscript-3 - 无法从浏览器连接到服务器

flash - 高效 AS3 编码的技巧

apache-flex - 选择 TextArea 的 id(尽管有 RichEditableText)