点击事件监听BUG

  • Creator 版本: 2.4.7

  • 目标平台: Chrome

  • 重现方式:创建一个父节点一个子节点,父节点监听按下,抬起事件,子节点添加一个cc.Button或其他阻止冒泡的控件,点击子节点,父节点可以监听到按下事件,这时隐藏子节点,当手松开时,父节点监听不到抬起事件。
    如下示例项目压缩包,启动项目后点击cocos图标,等图标消失后松手,查看控制台,只有touchStart,没有touchEnd


    assets.zip (43.5 KB)

  • 首个报错: 无

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率: 100%

我是一个父节点 一个子节点 但是父节点什么都不干 字节点监听 touchmove touchend 事件
当在子节点中 按下后 touchmove touchend 都能正常响应
但是从父节点按下过后 再滑动到字节点的时候 touchmove touchend 都无法正常响应

触摸吞噬,子节点截断了touch事件,你可以试下监听touchcancel,滑动到子节点上时会触发父节点的cancel

有办法不退出吗 退出我就不能监听touch_end的坐标了

将触摸事件传递一下

我监听了俩按下和抬起,监听到了按下,子节点并没有截断按下事件,但当点击的节点隐藏时我再松手并没有监听到抬起

理论上我抬起时没有任何节点阻挡事件传递,
因为节点已经被隐藏,
现在现象是按下时第一个触碰到的节点如果删除或隐藏了,呢么不管是监听的touchmove,或者touchend都不会有事件传出,直到下一次按下才会恢复

事实上我是有个需求,手触摸到屏幕的话,在触摸点生成一个粒子,粒子随触摸点的移动而移动,并且不影响正常点击事件,我使用其他方案解决了

使用这个使事件可以在这个节点被监听,并且不影响我点击到下面的节点 (this.node as any)._touchListener.setSwallowTouches(false);
不过这个需要打开多点触摸
cc.macro.ENABLE_MULTI_TOUCH = true;

但我又需要单点触摸,为了防止两个按钮被同时点击,算是重新实现了一下button
//重写按钮方法

(function () {

var Super = function () { };

Super.prototype = cc.Button.prototype;

//实例化原型

Super.prototype._onTouchEnded = function (t) {

    // 限制在单点触摸,且可点击的情况下

    if (this.interactable && this.enabledInHierarchy && t.getTouches().length <= 1) {

        if (this._pressed) {

            cc.Component.EventHandler.emitEvents(this.clickEvents, t);

            this.node.emit("click", this);

        }

        this._pressed = !1;

        this._updateState();

    }

};

})();

直接在最开始执行的脚本class的外面粘上就好

1赞