2

我正在尝试使用 jquery 的$.ajaxor从不同的服务器获取文件$.getJSON,但我碰壁了access-control-allow-origin,而且 jsonp 选项似乎对我不起作用。

该站点使用 jQuery 1.5.1。

这是我的三个测试:

使用基本的 $.ajax,请求的 url 从未?callback=?附加:

$.ajax({
    url: url,
    datatype: 'jsonp',
    error: function(){console.log('error');},
    success: function(){console.log('success');}
});

使用基本的 $.ajax 并尝试破解,仍然会遇到跨站点问题:

$.ajax({
    url: url + '.jsonp?callback=?',
    datatype: 'jsonp',
    error: function(){console.log('error');},
    success: function(){console.log('success');}
});

使用 $.getJSON,可以解决跨站点问题,但永远不会触发错误情况:

$.getJSON(url + '?callback=?',
    function(data){
        console.log('success');
    })
    .error(function(){
        console.log('error');
    })
    .success(function(){
        console.log('success!');
    });

有人看到我做错了什么吗?最后,我正在尝试测试该 url 是否存在,如果不存在则执行错误操作。

编辑:我试图访问的 url 不存在。我期待触发错误案例。

4

4 回答 4

3

为了能够从 javascript 访问外部资源。远程资源必须包含access-control-allow-origin在响应头中。如果您可以控制该资源,则需要将此响应标头添加到*(或您的域,如果您想要更受限制的访问控制)。

在此处阅读有关此内容的更多信息:http: //enable-cors.org/

如果您不控制该外部资源。解决方案更棘手。有些人利用 YUI 进行跨域 ajax 调用。见这里:http: //jpvalappil.wordpress.com/2010/01/04/cross-domain-ajax-the-yui-way/

如果您正在编写 chrome 扩展,API 允许您授予扩展权限以从 js 访问其他域的资源。

于 2012-07-01T12:33:49.673 回答
1

您可以使用jQuery-JSONP。该脚本允许您捕获错误(尽管没有任何有意义的错误消息)。

   $.jsonp({
      "url": "http://gdata.youtube.com/feeds/api/users/"+userId+"?callback=?",
      "data": {
          "alt": "json-in-script"
      },
      "success": function(userProfile) {
          // handle user profile here 
      },
      "error": function(d,msg) {
          alert("Could not find user "+userId);
      }
    });

主要浏览器都支持:

  • 互联网浏览器 6+
  • 火狐 2+
  • 铬 1+
  • 野生动物园 3+
  • 歌剧 9+
于 2012-07-16T04:53:33.260 回答
0

你必须指定一个超时

$.ajax({
    dataType: "jsonp",
    url : url,
    timeout : 1000
})
    .done(function(data) {logdata(data); })
    .fail(function() { logdata("error"); });
于 2012-07-01T12:48:13.553 回答
0

您使用了数据类型,但您应该使用数据类型。

于 2017-02-19T19:18:42.647 回答