【问题标题】:Error: Failed to execute 'dispatchEvent' on 'EventTarget'错误:无法在“EventTarget”上执行“dispatchEvent”
【发布时间】:2015-12-10 15:08:57
【问题描述】:

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

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

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

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

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

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

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

可以滚动但发生许多未处理错误的Testapp可以是tested here

【问题讨论】:

  • 我想你误解了为什么它有效。我相信它之所以起作用,是因为它抛出了异常,从而停止了 ExtJS 的触摸处理。使用throw new Error();dispatchEvent 时,我得到了相同的行为,但是当我尝试/捕捉dispatchEvent 时,它确实捕捉到了,但因为没有抛出任何东西,它会停止滚动。

标签: javascript iframe extjs touch extjs5


【解决方案1】:

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

【讨论】:

  • 谢谢先生!你真的让我很开心,尽管我有点尴尬,因为我自己一开始没有想到这个;)
  • 没问题,有时你只需要第二双眼睛:)
猜你喜欢
  • 2021-02-25
  • 2016-07-24
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多