最近我一直试图摆脱每个小任务使用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/的内部运作方式以及它们如何实现这一目标。
由于
答案 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对象并为你转换它。