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?
前段时间,当我的 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?