没有指定 dataType 的自定义 ajaxTransport 函数未触发(完全!)
Posted
技术标签:
【中文标题】没有指定 dataType 的自定义 ajaxTransport 函数未触发(完全!)【英文标题】:Custom ajaxTransport function without specified dataType is not firing (AT ALL!) 【发布时间】:2012-09-10 23:39:24 【问题描述】:我一直在尝试设置 custom ajaxTransports for jQuery 以在某些情况下为我们的产品缩短某些工作流程。但是,我在让这些传输获得荣誉方面的成功率为零(而我有很多工作 custom ajaxPrefilters)。
用多个版本的 jQuery 测试:
1.5.2 1.6.4 1.7.2 1.8.0已在多种浏览器上测试:
火狐15 铬 21 ios 5 网页浏览量...
它们都不起作用。
JsFiddle 测试用例: http://jsfiddle.net/PVYut/
...
如果我添加一个dataType
来缩小范围,那么它可以正常工作。
JsFiddle 测试用例: http://jsfiddle.net/PVYut/1/
...
我只是做错了什么吗?我很高兴被告知,只要我能做到这一点! -_-
【问题讨论】:
【参考方案1】:$.ajaxTransport("+*", function(options, originalOptions, jqXHR, headers, completeCallback )
console.log("Executing ajaxTransport");
return
send: function( headers, completeCallback )
completeCallback(404, "error", );
,
abort: function()
/* abort code */
);
$.ajax("?jqTrans=" + (+(new Date())))
.done(function()
console.log("ERROR: Should not have been successful!");
)
.fail(function()
console.log("SUCCESS: Should have failed.");
);
这里是jsFiddle
【讨论】:
很好,谢谢!另一个 jQuery 文档不佳的案例。 =( 通常,传输被用作后备。您永远不应该依赖这样的运输订单(因此没有记录它)。创建一个预过滤器,重定向到另一个数据类型并使用您的自定义传输捕获这个数据类型是要走的路。很抱歉迟到了。 @JulianAubourg 我考虑过完全按照你的描述去做,但一想到要掩盖真实的dataType
,我就觉得很反感。充其量,您可以将真实的dataType
值存储在options
/settings
对象上的新属性中,用于预过滤器中的请求,然后将其恢复到传输中的dataType
属性。可行,但感觉更hacker。
在您的预过滤器中:“return 'myDataType';”在你运输:“options.dataTypes.shift();” -> 完成!你甚至保留了 dataType 链。例如,如果您想到一个模拟 ajax,这很有意义: $.ajaxPrefilter(function( options ) if ( options.mock ) return "mock"; ); $.ajaxTransport( "mock", function( options ) options.dataTypes.shift(); /* 现在我有了实际的 dataType 链来进行模拟 */ );我认为它实际上非常优雅。
在 API 站点中谈论内部选项(如 dataTypes)非常困难。我希望能抽出时间分别妥善记录所有这些内容。以上是关于没有指定 dataType 的自定义 ajaxTransport 函数未触发(完全!)的主要内容,如果未能解决你的问题,请参考以下文章
在 protobuf-net 中,有没有办法指定在序列化/反序列化给定类型时要使用的自定义方法?