代码之家  ›  专栏  ›  技术社区  ›  Arnaud F.

Ajax:如何正确修改jQuery源代码?

  •  0
  • Arnaud F.  · 技术社区  · 14 年前

    在原始jQuery代码中,有:

    ajax: function( origSettings ) {
        // Some code
        function success() {
            // If a local callback was specified, fire it and pass it the data
            if ( s.success ) {
                s.success.call( callbackContext, data, status, xhr );
            }
    
            // Fire the global callback
            if ( s.global ) {
                trigger( "ajaxSuccess", [xhr, s] );
            }
        }
    }
    

    我想换个内裤 success 功能:

    ajax: function( origSettings ) {
        // Some code
        function success() {
            // Fire the global callback
            if ( s.global ) {
                trigger( "ajaxSuccess", [xhr, s] );
            }
    
            // If a local callback was specified, fire it and pass it the data
            if ( s.success ) {
                s.success.call( callbackContext, data, status, xhr );
            }
        }
    }
    

    这个顺序的触发变化更正常,更适合我。。。

    我该怎么做才好?(如果我能……)

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  0
  •   FloydThreepwood    14 年前

    你必须像这样覆盖它。

    jQuery.ajax =  
    // Some code
    function success() {
        // Fire the global callback
        if ( s.global ) {
            trigger( "ajaxSuccess", [xhr, s] );
        }
    
        // If a local callback was specified, fire it and pass it the data
        if ( s.success ) {
            s.success.call( callbackContext, data, status, xhr );
        }
    }
    

    不幸的是,在JS中无法覆盖对象层之外的代码。但考虑到这并不是一个好的实践,因为这会切断JQ中任何新的错误修复。

    你能更具体地说明你想实现什么样的功能吗?也许换另一面更简单?

        2
  •  0
  •   Arnaud F.    14 年前

    我找到了正确的方法:

    $("body").ajaxSend(function(event, XMLHttpRequest, s) {
         s._success = s.success;
         s.success = $.noop;
         s._error = s.error;
         s.error = $.noop;
         s._complete = s.complete;
         s.complete = $.noop;
    });
    
    $("body").ajaxSuccess(function(event, XMLHttpRequest, s) {
        // Generic code
        if(s._success) {
            s._success.call(s.context || s, s.data, s.status, XMLHttpRequest)
        }
    });
    
    /// ajaxError, ajaxComplete ///