1

我有一个使用 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 定义的示例代码

我正在创建动态模拟,所以我通过函数定义,而不是普通对象,像这样......

$.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;
});
4

2 回答 2

2

这似乎是 Mockjax 如何处理跨域脚本请求的错误。它并没有做任何特殊的事情来检测跨域请求(就像它对 JSONP 所做的那样),因此,当它将请求传递回原始$.ajax方法时——jQuery 从不使用由 Mockjax 提供的模拟 XHR 对象。

所以从本质上讲,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 对我的 ping 操作并将此问题引起我的注意。

于 2014-03-28T01:43:59.060 回答
0

您是否在模拟端点中设置dataType属性?

请参阅:https ://github.com/appendto/jquery-mockjax#data-types

如果是,您是否尝试过将模拟数据类型设置为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"
});
于 2014-03-20T13:14:31.210 回答