createjs事件侦听的一个小坑

在使用CreateJS时,频繁地add和remove事件监听器导致性能问题。通过断点调试,发现对象上积累了大量监听器。on/off与add/remove的用法不同,on/off内部创建了匿名函数包装回调,因此移除监听必须使用on返回的匿名函数作为参数。正确做法是保存on的返回值,然后用此值调用off方法,以确保正确移除监听。这增加了复杂性,相比之下,直接使用add/remove更简洁直观。
摘要由CSDN通过智能技术生成

重复多次地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方法返回的参数,也就是它自己创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于createjs库制作的画画房间代码,包括可选颜色、橡皮擦和画笔大小功能: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>画画房间</title> <style> canvas { border: 1px solid #000; } </style> </head> <body> <canvas id="canvas" width="800" height="600"></canvas> <div> <label>画笔颜色:</label> <select id="color"> <option value="#000000">黑色</option> <option value="#ff0000">红色</option> <option value="#00ff00">绿色</option> <option value="#0000ff">蓝色</option> <option value="#ffff00">黄色</option> </select> <label>画笔大小:</label> <select id="size"> <option value="5">小</option> <option value="10" selected>中</option> <option value="15">大</option> </select> <button id="eraser">橡皮擦</button> <button id="clear">清空</button> </div> <script src="https://code.createjs.com/1.0.0/createjs.min.js"></script> <script> var stage, canvas, shape, color, size, eraser, clear; function init() { canvas = document.getElementById("canvas"); stage = new createjs.Stage(canvas); shape = new createjs.Shape(); stage.addChild(shape); color = document.getElementById("color"); size = document.getElementById("size"); eraser = document.getElementById("eraser"); clear = document.getElementById("clear"); stage.addEventListener("stagemousedown", handleMouseDown); stage.addEventListener("stagemousemove", handleMouseMove); stage.addEventListener("stagemouseup", handleMouseUp); eraser.addEventListener("click", function() { color.value = "#ffffff"; }); clear.addEventListener("click", function() { shape.graphics.clear(); stage.update(); }); createjs.Ticker.addEventListener("tick", stage); } function handleMouseDown(event) { shape.graphics.setStrokeStyle(size.value, "round", "round") .beginStroke(color.value) .moveTo(stage.mouseX, stage.mouseY); stage.addEventListener("stagemousemove", handleMouseMove); } function handleMouseMove(event) { shape.graphics.lineTo(stage.mouseX, stage.mouseY); stage.update(); } function handleMouseUp(event) { stage.removeEventListener("stagemousemove", handleMouseMove); } window.onload = function() { init(); }; </script> </body> </html> ``` 代码中,我们创建了一个画布和一个`Shape`对象用于存储画画的图形。通过`select`元素和`button`元素实现了可选颜色、橡皮擦和清空功能。在`init()`函数中,我们初始化了画布和`Shape`对象,并添加了鼠标事件监听器。在鼠标按下时,我们开始绘制图形,并在移动鼠标时不断更新绘制的图形。在鼠标松开时,停止绘制图形。最后,通过`Ticker`对象来更新画布显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值