错误:无法在'EventTarget'上执行'dispatchEvent'

时间:2015-12-10 15:08:57

标签: javascript iframe extjs touch extjs5

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

我通过覆盖Ext框架中的一些内容来解决这个问题(参见the solution)。

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

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

即使这个解决方案基本上有效但它有一个缺陷: 调度事件会在每个InvalidStateError事件上抛出未处理的touchmove,这显然是经常发生的事情:

enter image description here

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

如何在不破坏滚动的情况下摆脱错误?

Testapp,其中滚动有效但许多未处理的错误可能是tested here

1 个答案:

答案 0 :(得分:2)

我找到了一个非常简单的解决方案:你可以通过在处理程序中返回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?