jQuery.ajaxTransport()
创建一个对象,用于处理Ajax数据的实际传输。
jQuery.ajaxTransport(dataType, handler(options, originalOptions, jqXHR))
- dataType类型: String。一个字符串,标识使用的数据类型
- handler(options, originalOptions, jqXHR)类型:Function()。一个处理程序,使用第一个参数中提供的数据类型返回新的传输(transport)对象。
传输(transport)是一个对象,它提供了两种方法,send
和abort
,内部使用由$.ajax()
发出请求。传输(transport)是最高级的方法用来增强$.ajax()
并且应仅作为当预过滤器(prefilters)和转换器(converters)无法满足你的需求的时候的最后的手段。
由于每个请求需要有自己的传输(transport)对象实例,传输不能直接注册。因此,你应该提供一个函数代替返回传输(transport)。
传输(transports)工厂注册使用$.ajaxTransport()
。一个典型的注册看起来像这样:
$.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
是一个请求头信息(键- 值)对象,该传输(transport)都可以发送,如果它支持completeCallback
是回调用于该请求Ajax的完成通知
completeCallback
具有以下签名:
function ( status, statusText, responses, headers ) {}
以下的情况下:
status
是响应的HTTP状态代码,像200是一个典型的成功,或404是没有找到资源。statusText
是响应状态文本。responses
(可选)是一个对象,它包含数据类型/值(dataType/value)包含响应运输提供的所有格式。(例如,一个原生的XMLHttpRequest对象设置reponses为{xml: XMLData, text: textData}
,这样响应是一个XML文档)headers
(可选)是一个字符串,其中包含所有的响应信息头,如果运输对它们的访问(类似于XMLHttpRequest.getAllResponseHeaders()
提供的方法)。
就像预过滤器(prefilters),一个传输(transport)的工厂函数可以被连接到一个特定的 dataType(数据类型):
$.ajaxTransport( "script",function ( options, originalOptions, jqXHR ) { /* Will only be called for script requests */ });
面的示例演示小的图像怎样传输实现:
$.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; } } }; } });
Handling Custom Data Types(处理自定义数据类型)
jQuery的Ajax实现了一套标准的数据类型,比如text, json, xml,和 html。
在$.ajaxSetup()
中使用converters
选项来增加或修改数据类型使用$.ajax()
转换策略。
未更改的 jQuery 代码本身包含一个列表的默认转换器,这有力地说明了可以如何使用它们:
// 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”转换器:
jQuery.ajaxSetup({ accepts: { script: "text/javascript, application/javascript" }, contents: { script: /javascript/ }, converters: { "text script": jQuery.globalEval } });