「系统级Bug」cocos creator 的 touch 事件冒泡是不是有bug哦?😄

捕获没有问题,但是冒泡就有问题。

我在根结点canvas的 node上注册一个touch事件,如果子node有注册事件,那么canvas node上注册的事件,冒泡始终监听不了;可以肯定子node函数监听没有调用event.stopPropagation或者event.stopPropagationImmediate来立即停止冒泡。

但是捕获却可以。但是捕获会优先处理监听事件,并不是我想要的。

有, 我说过还给过例子, 官方表示看不到

用2.2.1-Bate3测试了一下,并没有发现你所所的,canvas上注册监听后没有监听到时间的情况。NewProject.zip (44.8 KB)
这是我用来测试的demo。

麻烦说下你使用的版本,提供一下demo,以及说明一下你认为错误的表现

我现在去下载2.2.1去试验一下。

ccc2.2.1还在下载,等会下载我试验一下,我先解释一下,我对冒泡的理解:

真正的冒泡应该是自下而上的,比如父亲节点A,里面有个孩子节点B,孩子节点B里面有个孙子节点C。如果ABC同时注册了touch_begin事件,当我用鼠标,或者手指点击C时,应该依次执行一下回调:
you touched C.
you touched B.
you touched A.

如果我在B的回调中调用了stopPropagation,那么不执行回调A,即才会出现:
you touched C.
you touched B.

应该是这样,以上我理解的冒泡。

现在我们的问题是,以上情形,只会调用:
you touched C.

「放佛C回调在内部执行了stopPropagation」,这并不符合冒泡机制,您认为呢?

但是我们的节点有宽高的限制,如果点击位置不再指定的宽高内,好像是默认监听不到点击事件的,但这个可以再重新定义说明,先假设我们讨论以上都在指定的宽高范围内的事件冒泡。

不知道您是否认可,我一会试一下2.2.1的版本。

关于触摸事件冒泡文档中有详细的解释,请参考
https://docs.cocos.com/creator/manual/zh/scripting/internal-events.html#触摸事件冒泡

看完了,文档解释的貌似没问题啊,和我理解一样。

我上面的版本,使用的是2.1.3

我这边用2.1.3看来下我自己弄的demo,正常啊。麻烦你确认一下,另外最好提供demo,否则我也不知道你的问题在哪

好的,你等会。

找到问题了,把子节点所有事件都关了,canvas上就监听不到了。。。

NewProject.zip (830.0 KB)

`@ccclass
export default class TouchEvent2 extends cc.Component {

@property
useCaption: boolean = false;

// LIFE-CYCLE CALLBACKS:

onLoad () {
    //把这里事件关掉,外面的canvas就监听不了了:
    // this.node.on(cc.Node.EventType.TOUCH_START,this.onClick,this);
    // this.node.on(cc.Node.EventType.TOUCH_END,this.onEndClick,this);
}`

我本来以为是冒泡导致的上层节点不能响应回调,后来仔细你的代码,确实都没问题,然后才发现我这边是由于子节点并没有注册同类型事件,现在有了你这个方法,我为了解决我那个问题,不得不在子节点上注册一个同类型事件,:smile:

这样解决了上层node监听不响应都问题。

事件传递能算系统级bug?有点标题党啊

如果真的是事件冒泡的bug,说系统级bug,其实也并不为过,哈哈,事件冒泡是个很重要必备的功能。
现在问题已经定位,但可能还不能归为事件冒泡的bug,所以确实有点标题党的嫌疑。:joy:

等BigBear回复。
@BigBear

我还以为是引擎运行的时候报错了呢

触摸不是默认吞噬的么 开启吞噬就不会冒泡了吧

你对触摸吞噬和事件冒泡可能有点误解。。。

正常情况下,同级没有遮挡,不应该不响应事件吧,这和吞噬没关系的吧啊哦啊?

我理解成了吞噬之后就不冒泡了 没用过冒泡:joy:

:grinning:节点上有Button组件也会阻止事件冒泡呢。