Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Firefox下按Escape可终止我的Ajax请求。I';我想防止这种情况_Javascript_Ajax_Firefox_Javascript Events_Comet - Fatal编程技术网

Javascript 在Firefox下按Escape可终止我的Ajax请求。I';我想防止这种情况

Javascript 在Firefox下按Escape可终止我的Ajax请求。I';我想防止这种情况,javascript,ajax,firefox,javascript-events,comet,Javascript,Ajax,Firefox,Javascript Events,Comet,我正在开发一个需要长时间运行Ajax请求的web应用程序。不幸的是,在Firefox下,在请求过程中按Escape有一个缺点,即终止请求及其所保存的任何信息。这是相当恼人的,因为如果在错误的时间发生,这可能会导致各种严重的并发症。因此,我想停用此功能 我的第一个反应是在边界拦截按键,以确保它们不会到达窗口。为此,我安装了一个[keypress]事件处理程序,仅用于[keyChar]为27的事件,并让它调用[stopPropagation]和[preventDefault]。有一段时间,它看起来像

我正在开发一个需要长时间运行Ajax请求的web应用程序。不幸的是,在Firefox下,在请求过程中按Escape有一个缺点,即终止请求及其所保存的任何信息。这是相当恼人的,因为如果在错误的时间发生,这可能会导致各种严重的并发症。因此,我想停用此功能

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

然后,我意识到当用户没有单击窗口上的任何位置时,它将不起作用,因为事件处理程序从未收到事件。我试图将我的处理程序附加到或没有用,所以我最终添加了一个[load]事件处理程序,并让它强制聚焦到。有一段时间,它看起来像是在工作

然后,我意识到,当用户出于某种原因再次编辑事件时,或事件处理程序似乎从未收到该事件。因此,我添加了另一个[keypress]处理程序,当[keyChar]为27时,在上使用[preventDefault]进行拦截

目前看来,它似乎正在发挥作用。然而,考虑到我的应用程序中有这个bug的历史,我有点悲观

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


谢谢

< P>我会担心当用户选择书签或在请求中导航时发生的其他严重并发症。您可能想看看为什么要使用长时间运行的请求,看看这是否是可以更改的


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

我知道这是一种旧线程,但在这个问题上,Mozilla记录了一个活跃的bug(我也面临这个问题)。有关更多信息,请参阅

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


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

BOSH和Comet是需要长时间运行ajax请求的好例子。我们没有听说过它们,但看看BOSH,该协议应该是容错的,并且可以在多个请求上进行拆分:不,我们完全无法绕过长时间运行的请求。我们需要能够立即将结果从服务器推送到浏览器——而且我们不能只与HTML5浏览器和WebSocket兼容。但是不要担心你提到的其他令人讨厌的复杂问题,我们已经处理好了。请用户(很好地)不要按Esc:-)我不知道该应用程序,但似乎只要结束请求不会在服务器端造成数据完整性问题,在这种情况下,捕获关键事件可能就足够了。)谢天谢地,服务器不会有数据完整性问题。但是
Esc
可能会设置客户端为不一致状态,这通常是不可接受的。在我做了所有补丁之后,我无法重现这个问题,因此我会谨慎地将其标记为“可能已解决”。并且希望,如果这个问题没有得到真正解决,用户不会只是开始按
Esc
Esc
首先取消Ajax请求的确切方式是什么?我以前从来没有听说过这种情况。@Matt,如果你有firebug,你会注意到在你击中escape的那一刻连接就被切断了。@Kirk-wow,我确实看到了。它在没有Firebug的情况下也会发生吗?是的,即使Firebug关闭,它也会停止XHRs。我不明白为什么文本字段中的事件不会冒泡到文档中。我测试了它,它对我有效。该输入上有其他处理程序阻止它吗?
window.addEventListener('keydown', function(e) {(e.keyCode == 27 && e.preventDefault())});