没有指定dataType的自定义ajaxTransport函数没有触发(全部!)

Jam*_*ene 6 ajax jquery xmlhttprequest jqxhr

我一直在尝试为jQuery设置自定义ajaxTransports,以便在某些情况下为我们的产品缩短某些工作流程.但是,我没有成功地使这些传输得到尊重(而我有许多工作定制ajaxPrefilters).

测试了多个版本的jQuery:

  • 1.5.2
  • 1.6.4
  • 1.7.2
  • 1.8.0

使用多个浏览器进行测试:

  • Firefox 15
  • Chrome 21
  • iOS 5网页浏览量

...

他们都没有工作.

JsFiddle测试用例: http ://jsfiddle.net/PVYut/

...

如果我添加一个dataType来缩小它,那么它工作正常.

JsFiddle测试用例: http ://jsfiddle.net/PVYut/1/

...

我只是做错了吗?我很高兴被告知,只要我能让这个工作!-_-

Vik*_* S. 3

$.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.");  
    });
Run Code Online (Sandbox Code Playgroud)

这是jsFiddle

  • 通常,传输被用作后备。您永远不应该依赖这样的传输订购(因此没有记录它)。创建预过滤器,重定向到另一个数据类型并使用自定义传输捕获此数据类型是正确的方法。抱歉参加聚会迟到了。 (2认同)
  • 在你的预过滤器中:“return 'myDataType';” 在你的传输中:“options.dataTypes.shift();” -> 完成!你甚至保留了 dataType 链。例如,如果您想到模拟 ajax,它就很有意义: $.ajaxPrefilter(function( options ) { if ( options.mock ) { return "mock"; }); $.ajaxTransport( "mock", function( options ) { options.dataTypes.shift(); /* 现在我有了实际的 dataType 链来进行模拟 */ }); 我认为它实际上非常优雅。 (2认同)
  • 在 API 站点中谈论内部选项(如数据类型)是相当困难的。我希望能找到一些时间来分别正确记录所有这些内容。 (2认同)