Передача необязательных параметров в javascript / jquery - PullRequest
2 голосов
/ 14 декабря 2011

Ниже дано определение JQuery .load ():

.load( url [, data] [, complete(responseText, textStatus, XMLHttpRequest)] );

Аргументы data и complete () являются необязательными.Правильно?Но тогда, как мы можем назвать это:

$('#result').load('ajax/test.html', function(){
    alert('Load was performed.');
}

Как jquery игнорирует 2-й аргумент и знает, что мы предоставили 1-й и 3-й аргумент?А что, если аргумент 3d не является функцией?

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

См. Исходный код .

load: function( url, params, callback ) {

    if (typeof url !== "string" && _load) {
        // My comment: the function.apply ia an 
        // alternative way to call a javascript function, 
        // where the number of parameter in `arguments` 
        // couldn't be determined
        // the `arguments` is a special javascript variable. 
        // It's an array containing the parameters within 
        // the context of a function
        return _load.apply(this, arguments);

    // Don't do a request if no elements are being requested        
    } else if ( !this.length ) {            
        return this;        
    }       

    var off = url.indexOf( " " );       
    if ( off >= 0 ) {           
        var selector = url.slice( off, url.length );            
        url = url.slice( 0, off );      
    }       

    // Default to a GET request     

    var type = "GET";       
    // If the second parameter was provided     
    if ( params ) {         
        // If it's a function           
        if ( jQuery.isFunction( params ) ) {
            // We assume that it's the callback             
            callback = params;              
            params = undefined;         
            // Otherwise, build a param string          
        } else if ( typeof params === "object" ) {              
            params = jQuery.param( params, jQuery.ajaxSettings.traditional );               
            type = "POST";          
        }       
    }

 .... other code
1 голос
/ 14 декабря 2011

Давайте посмотрим на исходный код, чтобы вы увидели, является ли второй параметр функцией, затем передайте второй параметр params в третий параметр callback и установите для второго параметра params значение undefined.

    // If the second parameter was provided
    if ( params ) {
        // If it's a function
        if ( jQuery.isFunction( params ) ) {
            // We assume that it's the callback
            callback = params;
            params = undefined;

        // Otherwise, build a param string
        } else if ( typeof params === "object" ) {
            params = jQuery.param( params, jQuery.ajaxSettings.traditional );
            type = "POST";
        }
    }
1 голос
/ 14 декабря 2011

Если load вызывается с двумя или более аргументами, jQuery проверяет, является ли второй аргумент функцией или объектом.Если это функция, она вызывается после завершения вызова ajax.В противном случае он используется как параметры, передаваемые с помощью вызова ajax.

Соответствующие части из источника:

if ( params ) {
    // If it's a function
        if ( jQuery.isFunction( params ) ) {
        // We assume that it's the callback
        callback = params;
        params = null;
    // Otherwise, build a param string
    } else if ( typeof params === "object" ) {
        params = jQuery.param( params, jQuery.ajaxSettings.traditional );
        type = "POST";
    }
}

Где params - второй аргумент load.

isFunction является результатом следующих функций:

isFunction: function( obj ) {
    return jQuery.type(obj) === "function";
},
type: function( obj ) {
    return obj == null ?
        String( obj ) :
        class2type[ toString.call(obj) ] || "object";
},

, где class2type - это ассоциативный массив, содержащий, помимо прочего, этот элемент:

class2type[ "[object Function]" ] = "function";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...