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 表示典型的成功,或 404 表示资源未找到。
  • statusText 是响应的 statusText。
  • responses (可选) 是一个包含 dataType/value 的对象,其中包含传输可以提供的响应的所有格式(例如,本机 XMLHttpRequest 对象将 responses 设置为 { xml: XMLData, text: textData } 用于作为 XML 文档的响应)
  • 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 实现附带一组标准数据类型,例如 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() 中每次调用时指定时,该对象将映射到默认转换器,覆盖您指定的转换器,并保持其他转换器不变。

例如,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
}
});