根据加载文件的内容,防止分配的成功处理程序

时间:2012-03-27 12:06:41

标签: javascript jquery ajax handler

我试图找到一种方法来阻止我的正常成功处理程序,如果某些陈述是真的,例如

$.ajax({
    url: ...
    success: function( response ) {
        if ( response.success ) {
            // do success
        } else {
            // do fail, maybe login timeout
        }
    }
});

这是一种简单的方法。只需拥有一个success = true/false的对象即可。

但如果语句为真,有没有办法阻止我的成功处理程序被触发,例如

$.ajax({
    url: ...
    success: function( response ) {
        // do success
    }
});
$.ajaxFireBeforeAllOtherSuccessHandler(function(response) {
    return response.success;
});

然后将$.ajaxFireBeforeAllOtherSuccessHandler(伪名称)在所有其他成功处理程序之前触发,并确定其他成功处理程序是否会触发。

我知道我可以通过statusCode设置请求的401,然后使用$.ajaxSetup设置主控制:

$.ajaxSetup({
    statusCode: {
        401: function() {
            // this do fail
        }
    }
});

但目前我不可能做到这一点!

另一种方法是使用check方法将回调包装在:

$.ajax({
    url: ...
    success: function() { checkAjax(arguments, function() {
        // do success
    }); }
});
function checkAjax( a, c ) {
    return a[0].success && c.apply($, a);
}

根据加载文件的内容,有没有办法阻止分配的成功处理程序?

2 个答案:

答案 0 :(得分:3)

我找到了jQuery.ajaxPrefilter

Witch允许您在触发原始成功处理程序之前捕获所有ajax调用。然后你可以覆盖处理程序并进行测试以查看是否要激活原始文件:

jQuery.ajaxPrefilter(function( opts ) {
    var _success = opts.success; // Copy original
    opts.success = function( r ) { // Overwrite original

        var args = [].slice.call(arguments), // Convert arguments to a native array 
            isTrue = !(r.success === false); // Do my testing here

        if ( isTrue ) {
            _success.apply( this, args ); // Fire original with the right context and arguments
        } else {
            // Do my alert thing in here
        }
    };
});

感谢您的帮助@jfriend00

答案 1 :(得分:2)

如果您正在寻找一种全局方式来决定是否调用普通成功处理程序,那么我认为您可以这样做:

设置全局ajaxSuccess处理程序as described here。然后,在名为mySuccess: fn之类的ajax设置对象上创建自己的属性,并将成功处理程序放在那里而不是普通的success: fn,这样jQuery就不会自动为它调用它。然后,在ajaxSuccess处理程序中,您可以询问xhr对象并决定是否要继续调用您的success函数。如果这样做,那么您可以查看设置对象以获取mySuccess处理程序并调用它。

在一个不太复杂的方法中,您可以定义一个为普通成功处理程序设置的实用程序函数。在该成功处理程序中,您将检查响应的值以及它是否是您要查找的内容,然后您可以在设置对象上调用mySuccess函数。