pageview 嵌套 scrollview

你这里报错是 event.currentTarget = target; 这个行,然后 log 是打印了 _captureListeners 为 null ?

错误是这个

我这边测试了,不好重现你的问题都没报错,能否麻烦你给一个能重现的简单 demo 吗?

或者你调试看看,为什么 _captureListeners 是 undefined,按道理 undefined 是不会进入这个 if 判断的

我单独新建场景,测试也无法复现,所以很尴尬,可以告诉大概是什么东西有可能出错.我自己找找也行

估计target为undefined

目前最好的办法就是打断点调试,看看为什么 _captureListeners 为 undefined

或者官方有没有比较稳定的pageview 嵌套 scrollview有什么方案吗:grin:

目前没有,你看看论坛上有没有吧

去掉item上的button事件后基本不会复现,但是这个怎么处理呢?

居然还要为什么会触发该问题,才能知道如何修复,能否具体的描述一下呢?

呦。我的文章~~ 你把那个target 加多个非空判断 , 就暂时性忽略这个BUG。没多大影响。项目都上线跑了的

原函数cachedArray用函数外局部变量赋值,在嵌套调用时,会把记录状态抹掉,导致错误,改成cachedArray为函数内局部变量
`function _doDispatchEvent(owner, event) {
var target, i;
event.target = owner;

// Event.CAPTURING_PHASE

//修改这里
// _cachedArray.length = 0;
let cachedArray = [];`

提了一个 PR,修复这个问题:
https://github.com/cocos-creator/engine/pull/6816

1赞

小秘书你好:grin:

你们好,在我的测试中,发现又复现不了这个问题了。

NewProject.zip (8.3 KB)

麻烦你们再提供一个 demo 给我。

cocos creator 版本: 3.0;
复现情况:当嵌套的scrollView的content下的item节点上有监听touch事件,例如item有button组件的时候就会出错
原因:item节点有touch事件的时候,item在dispatch touch-move事件时,捕获阶段_cachedArray 是Scrollview和PageView,第一次for循环的时候,在target.eventProcessor.capturingTargets.emit(event.type, event, _cachedArray)时scrollview的_onTouchMoved方法内的(event.target as Node).dispatchEvent(cancelEvent)事件将_cachedArray清空了,所以第二次循环的时候,没有target。item节点没有touch事件的时候,第一个touch-move的dispatch节点可能是scrollview,所以捕获阶段_cachedArray是pageview,第一次循环之后也会清空,但是第二次的时候i = -1了,所以循环结束了,不会报错