首页>Program>source

我们使用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. 用户点击链接访问页面B在页面A上的AJAX元素加载完成之前。
  4. 在浏览器重定向到页面B之前,将短暂显示错误对话框。

有什么主意,当错误直接由用户访问新页面引起时,如何使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天前
    1 #

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

    不过,某些网站(例如GMail)的处理方式却相反:如果您尝试离开页面而又有一些ajax请求未决,它会提示您说某些进程仍在运行 ,然后让用户决定是在请求完成之前还是停留在网站上,还是继续浏览。

  • 2天前
    2 #

    基于上述大卫·赫德伦德(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文档的注释部分中的spec.我不得不绑定 'ajaxError'beforeunload 为了支持chrome(IE可以很好地处理文档). $(window) 当我绑定到 .ajaxError时没有开火 所以这就是为什么我有此窗口/文档解决方案的原因。

    $(window)

  • C#中的线程死锁示例
  • html:通过HTML5 <audio>标签搜索流式MP3文件