前段时间我遇到一个问题,当我的ExtJS 5应用程序嵌入到IFrame中时,滚动触摸设备不再起作用(参见this thread)。
我通过覆盖Ext框架中的一些内容来解决这个问题(参见the solution)。
该解决方案的一个步骤是将touchmove
事件发送到文档本身(该框架阻止对此事件的默认处理):
// ...
touchmove: function(e) {
window.document.dispatchEvent(e.event);
}
// ...
即使这个解决方案基本上有效但它有一个缺陷:
调度事件会在每个InvalidStateError
事件上抛出未处理的touchmove
,这显然是经常发生的事情:
如果我只是在dispatchEvent
语句周围放置一个try / catch,那么在触摸设备上滚动IFrame就不再有效了,好像根本没有调用它一样。
如何在不破坏滚动的情况下摆脱错误?
Testapp,其中滚动有效但许多未处理的错误可能是tested here。
答案 0 :(得分:2)
我找到了一个非常简单的解决方案:你可以通过在处理程序中返回false
来摆脱事件处理:
touchmove: function(e) {
return false;
}
这会使滚动的气泡升级到浏览器并得到正确处理。你还需要注意其他任何限制吗?
如果您真的想重新发送活动,这是正确的方法:
window.document.dispatchEvent(
new old_event.constructor(old_event.type, old_event)
);