我正在尝试使用以下jquery(虚拟)代码获取Google Currency Calculator
的货币汇率:
$.getJSON("http://www.google.com/ig/calculator?hl=en&q=1" + "DOP" + "=?" + "USD",
function(data) {
$('.currNumber').each(function (index) {
$(this).html(parseFloat($(this).html()) * 0.02681);
});
});
XMLHttpRequest无法加载http://www.google.com/ig/calculator?hl=en&q=1DOP=?USD。 Access-Control-Allow-Origin不允许使用origin'hostURL'。
在网站上查看我发现了关于这个主题的各种主题,但他们主要是指本地文件访问并尝试通过使用附加参数启动chrome来解决它(我也使用chrome)但这不是我的问题,实际上似乎与跨域限制更相关。
所以,问题是:如何使用jQuery从该网址获取费率?
答案 0 :(得分:17)
Ajax请求受浏览器Same Origin Policy的限制。简而言之,这意味着您无法通过与运行脚本的页面不在同一域中的ajax直接与服务器通信。因此,除非您正在为google.com开发页面,否则无法直接与google.com交谈。
这种限制的解决方法涉及插入脚本标记(通过脚本标记加载的JS文件不受相同的原始策略约束),然后使用JSONP回调将数据结果从这些脚本传回主脚本标签。如果您尝试使用的API支持它,那么您可能需要执行此操作。
jQuery将在这里为您提供很多帮助,因为它可以自动将ajax调用转换为通过脚本标记加载的JSONP调用,并且可以在跨域情况下工作。根据{{3}},如果在ajax调用的参数字符串中看到“callback =”或者设置了crossDomain选项,它会自动执行此操作。
答案 1 :(得分:2)
修改强>
我觉得很清楚问题是什么,但似乎可能不是这样。您看到的这个错误是服务器限制您的域通过ajax请求访问它的资源。这是standard JavaScript security - 您的脚本只能与其源自的域进行通信。由于您的JavaScript未从Google的域中加载,因此它不在允许通过ajax访问计算器API的域列表中,这就是您看到此错误消息的原因。
使用jQuery进行跨域请求的选项为outlined here。正如我之前提到的,如果服务器支持它,JSONP将只是一个有效选项,因为它必须发回适当格式化的JSON。
如果您提供了指向您所指的网页的链接,这可能会有所帮助。
从外观来看,这个API不支持JSONP(除非有一个未记录的参数),这是你在这种情况下跨域ajax请求的唯一选择,因为你没有控制服务器,无法更改access control headers。
您可能需要考虑构建一个服务器端资源,以便为您访问此API,而不受the PHP script here等JavaScript安全模型的限制。
答案 2 :(得分:2)
似乎从这个链接 - http://api.jquery.com/jQuery.ajax/ - 之前由jfriend00提供 - 解释了一个参数,你可以包含在名为“crossDomain”的JQuery ajax请求中,这是一个布尔值。
crossDomain(对于同域请求,默认值为false,对于跨域请求,则为true) 类型:布尔值 如果要在同一域上强制执行跨域请求(例如JSONP),请将crossDomain的值设置为true。例如,这允许服务器端重定向到另一个域。 (版本增加:1.5)
因此将其设置为true应该解决(?)这个问题。我不是专家,但是在经历了这个问题后我尝试了它,它似乎解决了这个问题。
示例:
$.ajax({ //my ajax request
url: "_URL_I_AM_MAKING_REQUEST_TO_",
type: "GET",
cache: false,
dataType: "json",
**crossDomain: true,**
data: { _mydata_
success : function(response){}
});
答案 3 :(得分:1)
小额外信息。
我遇到了这个问题,因为我在尝试发布到自己的服务器时出现此错误。
解决方案:确保主机名在ajax调用中匹配。
例如:
//This failed
$.post("http://domain.com/index.php/count/",
//This succeeded (the page this was called from was www.domain.com/.....)
$.post("http://www.domain.com/index.php/count/",