我有以下代码
function exista(word) {
alert(word);
var exists = 1;
jQuery.ajax({
async: false,
url: "http://api.wordreference.com/0.8/key/json/roen/" + word,
dataType: 'json',
method: "GET",
success: function(transport) {
if (transport.Error || transport.Response)
exists = 0;
}
});
return exists;
}
用于验证字典中是否存在单词。问题是它给出了Access-Control-Allow-Origin错误。从我收集的内容来看,似乎我必须使用JSONP,但我无法弄清楚如何(抱歉,我刚开始学习JavaScript等等)。那么,对如何修改上面的代码有任何想法?
谢谢。
答案 0 :(得分:2)
您的dataType
应该是jsonp
,而不是'json`。
<强>更新强>
根据http://www.wordreference.com/docs/api.aspx:
此外,对于JSPONp,JSON API可以进行可选的回调 函数在查询字符串中;只需添加“?callback = {yourCallback}”即可 URL的结尾。
所以API确实支持JSONP。
此外,JSONP表示“带填充的JSON”,因此您将获得JSON响应。 JSONP仅允许使用CORS。
将dataType
更改为jsonp
:
“jsonp”:使用JSONP加载JSON块。添加一个额外的 “?回调=?”到URL的末尾以指定回调。禁用 通过将查询字符串参数“_ = [TIMESTAMP]”附加到缓存来缓存 URL除非cache选项设置为true。
您可以通过使用jsonpCallback
设置指定一个来覆盖默认回调。
最后,您还应添加错误处理程序并将async
设置为true
:
jQuery.ajax({
"async": true, //cannot be false for JSONP
"url": "http://api.wordreference.com/0.8/key/json/roen/" + word,
"dataType": 'jsonp',
"method": "GET",
"error": function (jqXHR, textStatus, errorThrown) {
//included so you can see any errors
console.log(textStatus + ': ' + errorThrown);
},
"success": function (data, textStatus, jqXHR) {
//According to API documentation
//data will not likely contain either Error, or Response
//so, exists will likely not change to 0
if (data.Error || data.Response) {
exists = 0;
}
}
});
<强>更新强>
错误和“需要同步”的解决方案将是Pointy之前指出的。您必须创建一个与脚本在同一域上运行的服务器端代理。
服务器端代理可以返回JSONP,但坦率地说只返回JSON或XML更简单,因为CORS不是问题,代理可以是同步的。对于PHP示例脚本,Yahoo! Developer Network个主机source code for a simple proxy。
关于服务器端Web服务代理的任何其他内容,您需要指定您正在使用的服务器语言(并且它可能更适合作为不同的问题)。
答案 1 :(得分:0)
要使JSONP正常运行,您不仅需要在 方面对其进行编码,而且您要定位的网站也必须以这种方式使用,并相应地响应请求
如果其他站点已经没有JSONP API,并且您无法控制它,则JSONP不是答案。您必须创建自己的服务器端代理。
编辑 - 根据网站,他们确实支持JSONP。你只需要添加“?callback =?”到URL的末尾。