错误:无法在“EventTarget”上执行“dispatchEvent”

sua*_*kim 0 javascript iframe extjs touch extjs5

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

我已经通过覆盖 Ext 框架中的一些内容解决了这个问题(请参阅解决方案)。

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

// ...
touchmove: function(e) {
    window.document.dispatchEvent(e.event);
}
// ...
Run Code Online (Sandbox Code Playgroud)

尽管这个解决方案基本上有效,但它有一个缺陷:调度事件会InvalidStateError在每个touchmove事件上抛出一个未处理的事件,这显然很常见:

在此处输入图片说明

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

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

可以在此处测试滚动有效但发生许多未处理错误的 Testapp 。

Rud*_*olf 5

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

touchmove: function(e) {
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这将使滚动气泡上升到浏览器并得到正确处理。您还有其他需要注意的限制吗?

如果你真的想重新调度事件,这是正确的方法:

window.document.dispatchEvent(
    new old_event.constructor(old_event.type, old_event)
);
Run Code Online (Sandbox Code Playgroud)

另请参阅:如何克隆或重新调度 DOM 事件?