为何canvas添加鼠标点击事件后每次会触发两次回调函数?

如果在画布上添加一个sprite,如果这个sprite和画布都添加了鼠标点击事件,只要点击一次sprite,画布会响应两次点击事件


代码是这样的

点击后画布点击事件执行两次

sprite鼠标事件不论用MOUSE_DOWN还是MOUSE_UP都会让cavas事件执行两次,如果换成触摸事件TOUCH_START就不会出现这种问题,有哪位知道原因吗?

有朋友碰到过同样情况吗?

这个好像是节点收到事件后又dispatch给父节点,所以重复了
找到引擎文件engine\cocos2d\core\CCNode.js,函数_mouseDownHandler加一句event.stopPropagation();(改成和_mouseUpHandler一样),记得参照文档重新编译引擎

上传下你的测试工程,测试下比较好确认问题。 :test:

test.zip (34.7 KB)
随便建个2.4.10空项目就可以复现
image


image
MOUSE_UP是正常的,MOUSE_DOWN有重复,node3一次,node2两次,node1三次

对比一下2.4.10 CCNode.js的mousedown和mouseup
image image
再对比一下3.6.2 node-event-processor.ts的mousedown和mouseup
image image

在父级得movedown方法中执行 event.stopPropagation() 就好了

兄弟很仔细呀,2.4.10和3.6.2测下来都这样,不知道为啥这样设计

为了开发者可以实现更多的事件效果,所以加了这个设计,你这边加下 event.stopPropagation() 解决。

看下上面的引擎逻辑
3.6.2的 _handleMouseDown 和 _handleMouseUp 代码是一模一样的,且都有 event.propagationStopped = true,实测结果:mouseup正常,mousedown正常
2.4.10的 _mouseDownHandler 和 _mouseUpHandler 其它代码一模一样,只少了一行node.stopPropagation(); ,实测结果:mouseup正常,mousedown会有重复。_mouseDownHandler补上这一句之后,重新编译引擎,实测结果就正常了
确定引擎就是这样设计的?不是漏了一句?

刚对了下,你这个冒泡结果正确应该是下面这个结果,所以引擎侧是有问题的,这个版本的 mouse 事件处理有问题,如果使用 touch 事件,就没有这个问题。

onMouseDown3
onMouseDown2
onMouseDown1

嗯嗯,改一下引擎文件编译一下以后就能正常使用了,引擎里面漏了一句