如果用户在页面加载完成之前离开页面,则会触发jQuery ajaxError()处理程序

时间:2009-12-15 08:45:20

标签: jquery ajax global handler

我们使用jQuery的全局ajaxError()处理程序来警告用户任何AJAX失败:

$(document).ajaxError(function() {  
    $("There was a network or server error. Please try again later.").dialog({  
        title: "Error",  
        modal: true,  
        resizable: false,  
        buttons: { 'Ok': function() { (this).dialog("close"); } }  
    });  
});  

不幸的是,如果用户在完成加载之前离开页面,也会触发此全局错误处理程序。以下是重现错误的步骤:

  1. 用户访问页面A,其中包含通过AJAX加载的元素。
  2. 页面A上的AJAX元素开始加载。
  3. 在页面A上的 AJAX元素加载完成之前,用户点击链接访问页面B
  4. 在浏览器重定向到页面B之前,会短暂显示错误对话框。
  5. 我们知道如何在访问新页面的用户直接导致错误时触发ajaxError()吗?

    更新:在结合评论中的建议后,现在是我的代码:

    // I added a 3 second delay to our error dialog, enough time
    // for the user to leave for a new page:
    $(document).ajaxError(function() {
        setTimeout(my_error_handler, 3000);
    });
    
    // Warn user before leaving page if AJAX is still loading.
    // Not sure I'll keep this:
    $(document).ajaxStart(function() {
        ajaxing = true;
    });
    
    $(document).ajaxStop(function() {
        ajaxing = false;
    });
    
    window.onbeforeunload = function() {
        if (typeof(ajaxing) != 'undefined' && ajaxing) {
            return "Page elements are still loading!";
        }
    };
    

2 个答案:

答案 0 :(得分:15)

是的,如果用户导航到另一个页面,xhr将中止,这实际上是一次不成功的通信。一个解决方案是为onbeforeunload事件注册一个监听器,并在那里取消绑定ajaxError,基本上说:用户即将离开页面,所以我不希望被告知ajax错误可能会跟着。

有些网站,比如GMail,反过来说:如果你仍然有一些ajax请求未决,你会尝试离开页面,它会提示你有一些进程仍在运行,并让用户决定是否在请求完成之前留在网站上,或者继续离开。

答案 1 :(得分:10)

基于David Hedlund上面的回答,这里的代码对我有用:

//enable global ajax error handling
$(document).ajaxError(function (event, request, settings) {
    //your error handling code here
});

//user leaving page so ignore any unfinished ajax loads
$(window).bind('beforeunload', function () {
    $(document).unbind('ajaxError');
});

我从jquery ajaxError documentation的评论部分获得了'ajaxError'规范。我必须将beforeunload绑定到$(window)才能支持chrome(IE正常处理文档)。当我绑定到.ajaxError时,$(window)没有触发,所以这就是我有这个窗口/文档解决方案的原因。