为什么我无法通过跨域加载数据?

时间:2013-08-26 18:21:22

标签: jquery jquery-mobile windows-phone-8 cordova

我从webhost获取som JSON数据时遇到了一些问题。所以我没有把这个功能分解为GET谷歌,它仍然没有检索数据。没有任何反应,我已将下面的功能添加到应用程序中的按钮(onclick,返回false yada yada):

loadGoogle: function () {

  console.log('Lets load Google!');

  $.support.cors = true;
  $.mobile.allowCrossDomainPages = true;

  $.ajax({
    type: 'GET',
    contentType: 'text',
    url: 'http://google.com'
  })
    .done(function (data) { console.log('GOOGLE IS LOADED'); })
    .fail(function (xhr, error, et) { console.log('GOOGLE WAS NOT LOADED'); });

  console.log('The end');
}

模拟期间控制台中的输出:

CommandString : DebugConsole/log/DebugConsole1659732817/"Lets load Google!"
Log:["Lets load Google!","DebugConsole1659732817"]
The thread 0xfb0 has exited with code 259 (0x103).
CommandString : DebugConsole/log/DebugConsole1659732818/"The end"
Log:["The end","DebugConsole1659732818"]
The thread 0xff4 has exited with code 259 (0x103).

如您所见,它在ajax之前和之后输出log,而不是donefail事件触发器。如你所见,我根据the doc启用了cors和allowCrossDomainPages。那我为什么要失败呢?谷歌不是我想读的源,但我甚至无法让它工作......

3 个答案:

答案 0 :(得分:2)

  

如你所见,我已经启用了角色......

启用CORS(对于其他人的网站)不是。要从google.com检索数据,他们必须启用CORS并允许您的来源从中提取数据。 (有一个通配符*,如果他们想让每个人都加载他们的内容。)

另请注意,浏览器必须support CORS。所有最新的现代桌面浏览器都像大多数移动浏览器一样,但请注意,IE8和IE9都要求您使用非标准XDomainRequest对象,而不是XMLHttpRequest(他们最终得到此正好在IE10中),jQuery为你做了平滑的特定跨浏览器问题(不会,也不会)。但是有插件可以做到。

如果您控制远程端(例如,您正在从中检索数据的webhost),则可以通过响应预检调用和GET来启用服务器级别的CORS。适当的回复标题。

更多:

答案 1 :(得分:0)

您可以使用代理通过网络服务器将呼叫路由到Google。如果您使用的是Microsoft IIS,则可以使用我在此处描述的URL重写模块cross domain AJAX using proxy。如果使用Apache,您可以使用mod_proxy通过网站的服务器重定向跨域调用。

这可能不太理想,但对您来说这可能是一个合理的解决方案。

答案 2 :(得分:0)

你可以使用Jsonp而不是Json,你应该没有问题:

     $.ajax({ 
        type: "POST",                                     
        url: 'http://DomainName.com/api.php',  
        dataType: 'jsonp',
        contentType: "application/json",
        cache: false,
      success: function(data)        
      {
       // append your data
      }