我有一个使用mockjax的动态模拟设置,它适用于我的大多数ajax请求,但是当dataType
设置为Script
时失败,并让请求落到常规Ajax处理程序
// gets mocked
$.ajax({
type: "GET",
url: "http://myurl.com/myfile.js?_=1395314460347"
})
// does not get mocked!
$.ajax({
type: "GET",
dataType: "script",
url: "http://myurl.com/myfile.js?_=1395314460347"
})
如何在mockjax中配置动态模拟以拦截dataType
集的请求?
我正在创建动态模拟,所以我通过函数定义,而不是普通对象,类似这样......
$.mockjax(function(settings) {
// settings.url == '/restful/<service>'
var service = settings.url.match(/\/restful\/(.*)$/);
if ( service ) {
return {
proxy: '/mocks/' + service[1] + '.json',
// handle `dataType: 'script'`
dataType: 'application/javascript'
};
}
return;
});
答案 0 :(得分:2)
这似乎是Mockjax处理跨域脚本请求的错误。它没有做任何特殊的事情来检测crossDomain请求(就像它使用JSONP一样),因此,当它将请求传递回原始$.ajax
方法时 - jQuery从不使用它提供的模拟XHR对象Mockjax。
所以从本质上说,Mockjax正在拦截请求,然后将其传递给jQuery,它就会失败。
我在这里打开了一个问题,因此可以修复:https://github.com/appendto/jquery-mockjax/issues/136
同时你有两个选择。如果你想快速修补mockjax,请将此行添加到471左右:
origSettings.crossDomain = false;
完成后,该部分将如下所示:
mockHandler.cache = requestSettings.cache;
mockHandler.timeout = requestSettings.timeout;
mockHandler.global = requestSettings.global;
origSettings.crossDomain = false;
copyUrlParameters(mockHandler, origSettings);
另一种选择(我建议反对)是将crossDomain: false
添加到您的实际AJAX请求中。我不建议这样做,因为以后在移除模拟时需要删除该行。
感谢@Nicholas Cloud向我发出警告并引起我的注意。
答案 1 :(得分:0)
您是否在模拟端点中设置了dataType
属性 ?
请参阅:https://github.com/appendto/jquery-mockjax#data-types
如果您是,您是否尝试将mock dataType设置为application/javascript
?
$.mockjax({
type: "GET",
dataType: "application/javascript",
url: "myfile.js?_=1395314460347",
responseText: "(function () { alert('hello world!'); }());"
});
$.ajax({
type: "GET",
dataType: "script",
url: "myfile.js?_=1395314460347"
});