把event.preventswallow设为true时,正常速度点击时 touch事件可以穿透到下层,但是当我快速点击的时候,下层ui将有概率收不到事件。
这是引导层


这里是下层UI里注册的touch-end点击任意处关闭事件
![]()


事件冒泡机制是浏览器/引擎自带的,Cocos Creator 在处理事件时也是遵循这个机制的。通常来说, event.preventswallow 可以阻止事件冒泡到更下层的节点。但是,在你快速点击时,可能出现了一些事件冲突或延迟等问题导致 preventswallow 失效。
为了解决这个问题,你可以尝试使用以下方法:
- 检查节点的事件是否正确绑定。可能出现事件不触发的原因之一是事件绑定不正确,导致事件无法正确传递。
- 使用节点的
setLocalZOrder方法调整节点的层级顺序。通过将需要拦截的节点放到上层,可以有效避免快速点击导致的事件冲突。 - 在快速点击时,可以考虑使用延时触发的方式,即不立即触发事件,而是等待一段时间后再触发。这样可以避免事件过于频繁导致的问题。
- 如果以上方法都无法解决问题,可以尝试使用更加细致的事件处理方式,比如使用触摸事件(
touchstart、touchmove、touchend)代替点击事件,手动控制事件的触发和传递。这样可以更加精细地控制事件的传递顺序和逻辑。
1赞
感谢大佬的仔细回答,我排查了很久发现问题应该出在我的通过引导的判定是只要touch-end里命中即可,但是事件要传递到下层需要start和end里都把preventswallow设为true 快速点击时有一定概率有这么一次点击touch-start的时候是被return掉了的 但是end里通过了 这就导致判定引导通过但是事件没传递下去 界面没有关闭
问题可能是由于快速点击导致的事件处理不及时,从而出现了预期之外的结果。你可以尝试优化事件处理,或者使用节流或防抖的方式来避免快速点击造成的问题。
此外,确保你的代码逻辑正确,所有的 touchstart 事件都必须返回 true ,这样才能确保后续的 touchmove 和 touchend 事件能够正常处理,并且在事件处理结束时,应该将 event.stopPropagation() 和 event.preventDefault() 都设置为 true ,以确保事件不会继续传递。
最后,如果以上方法都无法解决问题,你可以考虑使用其他的交互方式,例如按钮点击、手势等,来代替快速点击,以避免这个问题的出现。