jQuery.ajaxTransport()

jQuery.ajaxTransport( dataType, handler )返回类型:undefined

描述:创建一个对象,处理实际的Ajax数据传输。

传输是一个对象,它提供了两种方法:sendabort$.ajax()内部使用它来发出请求。传输是最高级的方法,用来增强$.ajax(),应该只用作当预筛选器和转换器都不够用时的最后手段。

因为每个请求需要它自己的传输对象实例,所以不能直接注册传输。因此,你需要提供一个函数来返回传输。

传输工厂是使用$.ajaxTransport()注意的。一个典型的注册如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
$.ajaxTransport( dataType, function( options, originalOptions, jqXHR ) {
if( /* transportCanHandleRequest */ ) {
return {
send: function( headers, completeCallback ) {
// Send code
},
abort: function() {
// Abort code
}
};
}
});

其中:

  • options是请求选项
  • originalOptions是提供给$.ajax()方法的选项,未经修改,因此没有来自ajaxSettings的默认值。
  • jqXHR是请求的jqXHR对象
  • headers是键值对请求头对象,如果支持它,它就可以传输。
  • completeCallback是用来通知Ajax请求已完成的回调函数。

completeCallback具有以下签名:

1
function( status, statusText, responses, headers ) {}

其中:

  • status是响应的HTTP状态代码,譬如对典型的成功是200,当资源没有找到时就是400。
  • statusText是请求的状态文本。
  • responses(可选参数)是一个对象,包含了dataType/value值,包含了传输可以提供的所有格式的响应(例如,一个原生的XMLHttpRequest对于XML文档的响应,将把响应设置为{ xml: XMLData, text: textData })。
  • headers(可选参数)是一个字符串,如果传输已经访问到它们就包含了所有的响应头(类似于XMLHttpRequest.getAllResponseHeaders()提供的)。

就像预筛选器那样,传输的工厂函数可被附加到特定的dataType上:

1
2
3
$.ajaxTransport( "script", function( options, originalOptions, jqXHR ) {
// Will only be called for script requests
});

下面的示例演示如何实现最小的图像传输:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$.ajaxTransport( "image", function( s ) {
if ( s.type === "GET" && s.async ) {
var image;
return {
send: function( _ , callback ) {
image = new Image();
function done( status ) {
if ( image ) {
var statusText = ( status === 200 ) ? "success" : "error",
tmp = image;
image = image.onreadystatechange = image.onerror = image.onload = null;
callback( status, statusText, { image: tmp } );
}
}
image.onreadystatechange = image.onload = function() {
done( 200 );
};
image.onerror = function() {
done( 404 );
};
image.src = s.url;
},
abort: function() {
if ( image ) {
image = image.onreadystatechange = image.onerror = image.onload = null;
}
}
};
}
});

处理自定义数据类型

jQuery Ajax实现功能携带了一些标准dataType,譬如text、json、xml和html。

使用$.ajaxSetup()中的converters选项来增强或修正$.ajax()所用的数据类型转换策略。

未经修改的jQuery源本身包括了一些默认的转换器,它们有效地演示了可以如何使用它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// List of data converters
// 1) Key format is "source_type destination_type"
// (a single space in-between)
// 2) The catchall symbol "*" can be used for source_type
converters: {
// Convert anything to text
"* text": window.String,
// Text to html (true = no transformation)
"text html": true,
// Evaluate text as a json expression
"text json": jQuery.parseJSON,
// Parse text as xml
"text xml": jQuery.parseXML
}

如果你在$.ajaxSetup()中全局地指定了converters选项,或者在每个$.ajax()调用中指定了converters选项,此对象将映射到默认的转换器,重写你指定的那些,其它保留原样。

例如,jQuery源使用$.ajaxSetup()来添加针对“text script”的转换器:

1
2
3
4
5
6
7
8
9
10
11
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript"
},
contents: {
script: /javascript/
},
converters: {
"text script": jQuery.globalEval
}
});