【问题标题】:Pressing Escape under Firefox kills my Ajax requests. I'd like to prevent this在 Firefox 下按 Escape 会杀死我的 Ajax 请求。我想防止这种情况
【发布时间】:2010-10-07 15:48:38
【问题描述】:

我正在开发一个需要长时间运行 Ajax 请求的 Web 应用程序。不幸的是,在 Firefox 下,在请求期间按 Escape 的缺点是会终止请求及其所持有的任何信息。这很烦人,因为如果这发生在错误的时间,可能会导致各种令人讨厌的并发症。因此,我想停用此功能。

我的第一个反应是在

的边界处拦截按键,以确保它们不会到达窗口。为此,我安装了一个 [keypress] 事件处理程序,仅针对 [keyChar] 为 27 的事件,并让它调用 [stopPropagation] 和 [preventDefault]。有一段时间,它看起来很有效。

然后,我意识到当用户没有单击窗口上的任何位置时它不起作用,因为

事件处理程序从未收到该事件。我试图将我的处理程序附加到 无济于事,所以我最终添加了一个 [load] 事件处理程序并将其强制焦点到 。有一段时间,它看起来很有效。

然后,我意识到当用户编辑 时,出于某种原因,

事件处理程序似乎再也没有收到该事件。因此,我添加了另一个 [keypress] 处理程序,当 [keyChar] 为 27 时,在 上使用 [preventDefault] 进行拦截。

目前,它看起来正在运行。但是,鉴于我的应用程序中存在此错误的历史,我有点悲观。

所以,我想知道是否有更好的 - 并且可重复的 - 方法。回想一下,这个 bug 似乎只出现在 Firefox 中,所以我非常愿意在这里采用仅 Firefox 的方法。

【问题讨论】:

  • Esc 究竟是如何取消 Ajax 请求的?我以前从未听说过这种情况。
  • @Matt,如果你有萤火虫,你会注意到连接在你点击逃生的那一刻就被杀死了。
  • @Kirk - 哇,我看到了。没有 Firebug 也会发生这种情况吗?
  • 是的,它确实会阻止 XHR,即使关闭了 firebug。
  • 我不明白为什么来自文本字段的事件没有冒泡到文档中。我测试了它,它对我有用。该输入上的任何其他处理程序会阻止它吗?

标签: javascript ajax firefox dom-events comet


【解决方案1】:

我担心当用户选择书签或在请求中间导航离开时会发生其他令人讨厌的并发症。您可能想看看为什么要使用长时间运行的请求,看看是否可以更改...

如果它不是你可以改变的(或者即使你可以改变),你应该看看为什么你的请求不能容错。有没有办法将通信放入事务中,并在连接中断时回滚最新的?

【讨论】:

  • BOSH 和 Comet 是需要长时间运行 ajax 请求的好例子。
  • 没听说过,但是看看 BOSH,该协议应该是容错的,并且可以拆分为多个请求:xmpp.org/extensions/xep-0124.html#reqs
  • 不,我们绝对无法绕过长时间运行的请求。我们需要能够立即将结果从服务器推送到浏览器——我们不能只兼容 HTML5 浏览器和 WebSockets。但不要担心你提到的其他令人讨厌的并发症,我们已经处理好了。
  • 请用户(很好地)不要按 Esc 怎么样 :-) 我不知道该应用程序,但似乎只要结束请求就不会导致数据完整性问题在服务器端,在这种情况下捕获关键事件可能就足够了。
  • ) 谢天谢地,服务器不会有数据完整性问题。但是Esc 可能会设置客户端是不一致的状态,这通常是不可接受的。在我的所有补丁之后,我无法重现该问题,因此我会谨慎地将其标记为“可能已解决”。并希望,如果它没有真正解决,用户不会只是开始按Esc
【解决方案2】:

我知道这是一个旧线程,但有一个针对 Mozilla 的关于此问题的活动错误记录(我也面临)。请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=614304 了解更多信息。

此错误的一个建议是拦截并防止在窗口级别按下 ESC 键(OP 也提到过):

window.addEventListener('keydown', function(e) {(e.keyCode == 27 && e.preventDefault())});

不过,这可能会产生不必要的副作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多