jQuery AJAX jsonp无法处理响应

时间:2013-06-23 04:52:26

标签: jquery ajax json jsonp

所以,我写了一个WordPress插件来生成一个JSON文件,其中包含最新的X文章,可以从URL访问,然后使用CloudFront进行缓存。

所以,我这样访问我的文件(在浏览器中):http://mm.site.com/wp-content/uploads/plug/plug.json

我得到了我的JSON格式响应文件:

{"id":55142,"title":"Un nuevo modelo productivo para Espa\u00f1a","url": ....

现在,这是我用来以异步模式访问文件的js代码:

var jqXHR = $.ajax({
    type: 'GET',
    url: 'http://mm.site.com/wp-content/uploads/plug/plug.json',
    contentType: "application/json",
    dataType: 'jsonp'
});

jqXHR.done(function(json) {
       console.log(json);
    })
    .error(function(e) {
       console.log(e);
    })
    .always(function(test) {
        console.log(test);
    });

现在,古玩部分是网络选项卡(Firebug或Chrome开发工具),我看到了请求,最终得到200 Status Code和文件内容,但我看不到.done()中的响应,因此我无法访问和使用它。

为什么会有这样的想法?

更新

json代替jsonp,由于cross-origin control而无法执行此操作。请记住,我从亚马逊的CloudFront服务该文件。我尝试修复它,但没有运气,所以除非你有其他选择,否则我别无选择,只能使用jsonp

1 个答案:

答案 0 :(得分:1)

编辑:正如@Felix Kling所说,done确实将该函数注册为回调,主回调是一个jQuery处理程序,如下所示:

?callback=jQuery19104353667694941068_1372008424415&foo=bar

静态文件将无法正确响应此调用,因为jQuery会动态生成处理程序名称。

如果静态文件的格式为jsonpCallback: "fixedName"

,则设置fixedName({ .. some variable ..})将起作用

原始回复:

jsonp不会触发done方法。它附加script标记,如:

<script type="text/javascript" src="http://anothersite.com/?callback=whatToDoWhenDone"></script>

预期的响应将是JS代码,它将调用whatToDoWhenDone和JSON对象作为参数:

whatToDoWhenDone({"id":55142,"title":"Un nuevo modelo productivo para Espa\u00f1a","url": .... });

如果您不需要使用jsonp,只需将其更改为json