jQuery Post内部工作

时间:2014-03-16 03:20:44

标签: javascript php jquery

最近我一直试图摆脱每个小任务使用jQuery,因为我需要做的大部分时间都是提交表单等。但是当我尝试运行一个简单的POST请求时,我注意到这实际上并没有发送到POST变量,因为在使用以下方法提交时必须使用file_get_contents('php:// input')检索它。

var request = new XMLHttpRequest();
request.open('POST', '/my/url', true);
request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
request.send(data);

然而,在jQuery中使用内置的ajax帖子将数据发送到post变量,并且可以在我的php脚本中使用$ _POST进行检索。任何人都可以向我解释这个函数https://api.jquery.com/jQuery.post/的内部运作方式以及它们如何实现这一目标。

由于

1 个答案:

答案 0 :(得分:0)

我认为您感兴趣的部分是ajax函数的这个片段,如果该数据不是字符串,则会对传递的数据调用jQuery.param()

// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
    s.data = jQuery.param( s.data, s.traditional );
}

jQuery.param(),它将几种格式(包括javascript对象)转换为key1=value1&key2=value2格式的查询字符串:

// Serialize an array of form elements or a set of
// key/values into a query string
jQuery.param = function( a, traditional ) {
    var prefix,
        s = [],
        add = function( key, value ) {
            // If value is a function, invoke it and return its value
            value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
            s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
        };

    // Set traditional to true for jQuery <= 1.3.2 behavior.
    if ( traditional === undefined ) {
        traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
    }

    // If an array was passed in, assume that it is an array of form elements.
    if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
        // Serialize the form elements
        jQuery.each( a, function() {
            add( this.name, this.value );
        });

    } else {
        // If traditional, encode the "old" way (the way 1.3.2 or older
        // did it), otherwise encode params recursively.
        for ( prefix in a ) {
            buildParams( prefix, a[ prefix ], traditional, add );
        }
    }

    // Return the resulting serialization
    return s.join( "&" ).replace( r20, "+" );
};

请注意,这些内容是直接从the source for v1.11.0复制的。

我相信XMLHttpRequest.send()函数需要查询字符串格式的数据,但jQuery会接受一个javascript对象并为你转换它。