从ajaxError中止ajax load()

时间:2014-05-16 13:06:35

标签: jquery ajax deferred

我的代码中有很多地方正在加载片段:

$('<div />').load('/some/thing/', function() { /* put it somewhere */ });

我还有一个ajaxError处理程序:

$(document).ajaxError(function(event, jqxhr, settings, exception) {
    if (jqxhr.status = 401) {
        return alert('401!!');
    }
    if (jqxhr.status = 404) {
        return alert('404!!');
    }
    return alert('boo!');
});

但是,即使触发了ajaxErro r,仍会触发与负载关联的处理程序。有没有办法取消&#34;已完成&#34;处理程序(用于触发加载程序的内容)来自ajaxErro r。

我玩过Deferred,但问题似乎是我无法访问completeDeferred对象。在jQuery ajax.js中:

jqXHR.complete = completeDeferred.add;

然而,.add()方法毫无用处。如果我只能以某种方式调用底层延迟对象的.empty()方法..

有什么想法吗?

编辑:我不关心中止HTTP请求。它做得很好。我只想保持回调(我通过.load()附加)来解雇。

2 个答案:

答案 0 :(得分:3)

问题是因为load的最终参数等同于complete的{​​{1}}参数。这意味着无论请求是否成功,它都会运行。我建议您将$.ajax更改为.load()调用,以便更好地控制逻辑流程。试试这个:

$.ajax

答案 1 :(得分:3)

您必须从.load切换到更通用的AJAX方法,否则从事件处理程序中检测失败。

检测失败:

$('<div />').load('/some/thing/', function(response, status, xhr) {
    if (status === "error") return;
    // your existing code goes here
});

使用更通用的方法:

$.get("/some/thing/").done(function(response) {
    $("<div />").html(response) // etc etc
});