Error: Failed to execute 'dispatchEvent' on 'EventTarget'

Error: Failed to execute 'dispatchEvent' on 'EventTarget'

前段时间,当我的 ExtJS 5 应用程序嵌入到 IFrame 中时,我遇到了在触摸设备上滚动不再起作用的问题(参见 )。

我已经通过覆盖 Ext 框架中的一些东西解决了这个问题(参见 )。

解决方案的一个步骤是向文档本身发送一个 touchmove 事件(框架阻止默认处理此事件):

// ...
touchmove: function(e) {
    window.document.dispatchEvent(e.event);
}
// ...

虽然这个解决方案基本上可行,但它有一个缺陷: 调度事件会在每个 touchmove 事件上引发未处理的 InvalidStateError,这显然很常见:

如果我只是在 dispatchEvent 语句周围放置一个 try/catch,在触摸设备上的 IFrame 内滚动将不再起作用,就好像根本没有调用它一样。

如何在不再次中断滚动的情况下消除错误?

可以滚动但出现许多未处理错误的测试应用 tested here

我发现了一个非常简单的解决方案:您可以通过在处理程序中返回 false 来退出事件处理:

touchmove: function(e) {
    return false;
}

这将使滚动气泡到达浏览器并得到正确处理。还有其他需要注意的约束吗?

如果你真的想重新派发事件,这是这样做的正确方法:

window.document.dispatchEvent(
    new old_event.constructor(old_event.type, old_event)
);

另请参阅:How to clone or re-dispatch DOM events?