createjs事件侦听的一个小坑

Posted 雷乌斯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了createjs事件侦听的一个小坑相关的知识,希望对你有一定的参考价值。

重复多次地add和remove之后,每次操作都变得非常卡。

进断点调试之后发现,这个显示对象上被我添加了好几万个listener。

看了一下自己写的窗口基类的代码

	this.on("added", onAddToParent);

        function onAddToParent(event) 
            //do sth. on added
            _this.off("added", onAddToParent);
            _this.on("removed", onRemoveFromParent);
        

        function onRemoveFromParent(event)
        
            //do sth. on removed
            _this.on("added", onAddToParent);
            _this.off("removed", onRemoveFromParent);
        

发现off并没有起作用,只有on在不断地添加侦听,所以每次侦听的数量都以2次方的速度增长。。。。


又去翻了一下api,发现off on 和add/removeEventListener 的用法是不一样的。

add/remove 是和as3一样

但是on/off 是创建了一个匿名函数,这个函数包住了我们传进去的侦听回调函数,然后通过调用这个匿名函数来执行回调,所以在off的地方把我们创建的回调函数当参数并没有用。要把on方法返回的参数,也就是它自己创建的匿名函数作为参数传给off才行。


也就是

warpperFunc = _this.on("added", callbackFunc);

_this.off("added", warpperFunc);

这样才能正确地移除侦听。


不过这样也太麻烦了,本来就是为了少打几个字我才用的off/on,以为这只是add/remove的简写,没想到是有区别的。看来还是老老实实用add/remove来的方便


以上是关于createjs事件侦听的一个小坑的主要内容,如果未能解决你的问题,请参考以下文章

React事件中遇到的一个小坑

Vue之DOM元素事件绑定_v-on指令

一个关于Windows下SetCursorPos和GetCursorPos的小坑

VUE中事件触发无法监听的bug

JS 的事件基础事件侦听与抛发

Canvas绘图优化之使用位图--基于createjs库