2

我有一个超时运行的程序在后台加载数据:

(function getSubPage() {
    setTimeout(function() {
        if (cnt++ < pagelist.length) {
            loadSubPage(pagelist[cnt]);
            getSubPage();
        }
    }, 500);
})();

loadSubPage()$.ajax()打电话时:

function loadSubPage(page) {
    if (typeof(initSubPages[page]) === "undefined") {
        $.ajax({
            type: "POST",
            url: '/Main/GetPageData',
            data: { page: page },
            success: function (returndata) {
                // ...
            },
            error: function() {
                alert("Error retrieving page data.");
            }
        });
        initSubPages[page] = true;
    }
}

我遇到的问题是,error如果打开任何 ajax 请求,当用户导航离开时,处理程序就会被击中。我试图.stop()通过在请求上解决这个问题window.onbeforeunload,但我不确定要调用什么对象.stop()

4

4 回答 4

4

jQuery 公开了 XMLHttpRequest 对象的 abort 方法,因此您可以调用它并取消请求。您需要将打开的请求存储到变量中并调用abort().

activeRequest = $.ajax({...

并阻止它

activeRequest.abort()
于 2012-11-06T20:26:38.243 回答
0

具有功能的$.ajax回报。此函数将在请求完成之前停止请求。XMLHTTPRequestObject.abort

var xhr = $.ajax({ /*...*/

..
..
/* Later somewhere you want to stop*/
xhr.abort();

阅读更多: 如何取消/中止 jQuery AJAX 请求?

于 2012-11-06T20:26:05.447 回答
0

使用 jQuery 中止 Ajax 请求

这应该会派上用场.. 你有一个 jQuery 方法可以做到这一点。

于 2012-11-06T20:28:08.057 回答
0

这是我根据反馈使用的解决方案:

window.onbeforeunload = function() {            
    for (page in ajaxing) {
        if (ajaxing[page] != null)
            ajaxing[page].abort();
    }
};

var ajaxing = {};

function loadSubPage(page) {
    if (typeof(initSubPages[page]) === "undefined") {
        var ajaxRequest = $.ajax({
            type: "POST",
            url: '/Main/GetPageData',
            data: { page: page },
            success: function (returndata) {
                 // ...
            },
            error: function() {
                alert("Error retrieving page data.");
            },
            complete: function() {
                ajaxing[lot] = null;
            }
        });
        ajaxing[page] = ajaxRequest;
        initSubPages[page] = true;
    }
}
于 2012-11-06T20:55:02.517 回答