在Firefox下按Escape会导致我的Ajax请求失败。我想阻止这个

时间:2010-10-07 15:48:38

标签: javascript ajax firefox javascript-events comet

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

我的第一反应是截取< body>边界处的按键,以确保它们不会到达窗口。为此,我安装了一个[keypress]事件处理程序,仅用于[keyChar]为27的事件,并调用[stopPropagation]和[preventDefault]。有一段时间,看起来这很有效。

然后,我意识到当用户没有点击窗口上的任何地方时它就不起作用,因为< body>事件处理程序从未收到过该事件。我试图将我的处理程序附加到< document>或者< window>无济于事,所以我最终添加了一个[load]事件处理程序,并强制将焦点转移到< body>。有一段时间,看起来这很有效。

然后,我意识到当用户由于某种原因再次编辑< input>时,< body>,< document>或者< window>事件处理程序似乎永远不会收到该事件。所以,我添加了另一个[keypress]处理程序,在< input>上拦截[preventDefault]。当[keyChar]为27时。

目前,看起来它正在发挥作用。但是,随着我的应用程序中这个bug的历史,我有点悲观。

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

由于

2 个答案:

答案 0 :(得分:2)

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

如果不是您可以更改的内容(或者即使可以),您应该查看为什么您的请求不具有容错能力。有没有办法将通信置于事务中,如果连接中断,则将最新的通信转回?

答案 1 :(得分:1)

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

此错误的一个建议是拦截并阻止在窗口级按ESC键(如OP所述):

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

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