我编写了一个运行正常的XMLHttpRequest,但返回一个空的responseText。
javascript如下:
var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
var myRequest = new XMLHttpRequest();
callAjax(anUrl);
function callAjax(url) {
myRequest.open("GET", url, true);
myRequest.onreadystatechange = responseAjax;
myRequest.setRequestHeader("Cache-Control", "no-cache");
myRequest.send(null);
}
function responseAjax() {
if(myRequest.readyState == 4) {
if(myRequest.status == 200) {
result = myRequest.responseText;
alert(result);
alert("we made it");
} else {
alert( " An error has occurred: " + myRequest.statusText);
}
}
}
代码运行正常。我可以通过,我得到readyState == 4和状态== 200但是responseText总是空白。
我收到错误调度的日志错误(在Safari调试中):getProperties,我似乎无法找到引用。
我已在本地和远程服务器上运行Safari和Firefox中的代码。
放入浏览器时的URL将返回字符串并提供状态代码200。
我在Mac Widget中向相同的URL写了类似的代码,运行正常,但浏览器中的相同代码永远不会返回结果。
答案 0 :(得分:26)
http://api.xxx.com/
是您网域的一部分吗?如果没有,则same origin policy阻止您。
您可能需要查看以下Stack Overflow帖子,了解一些可能的解决方法:
答案 1 :(得分:12)
问题已解决
在我的情况下问题是我在url param中使用完整路径进行ajax调用(使用jQuery中的$ .ajax,$ .get或$ .getJSON方法):
但正确的方法是将url的值传递为:
url:“site / cgi-bin / serverApp.php”
某些浏览器不会发生冲突并且不会在一个或另一个文本之间产生干扰,但在Firefox 3.6 for Mac OS中,将此完整路径作为“跨站点脚本” ...另一件事,在同一浏览器中有区别:
http://mydomain.com/site/index.html
然后把
http://www.mydomain.com/site/index.html
实际上它是正确的点视图,但大多数实现没有区别,因此解决方案是在执行ajax的方法中删除指定完整路径的所有文本到脚本请求 AND ....删除index.html文件中的所有 BASE 标记
base href =“http://mydomain.com/”< ---糟糕的主意,删除它!
如果您不删除它,此系统的此版本浏览器可能会收到您的ajax请求,就好像它是一个跨站点请求!
我遇到了同样的问题,但仅限于Mac OS机器上。问题是Firefox将ajax响应视为“跨站点”调用,在任何其他机器/浏览器中它都能正常工作。我没有找到任何帮助(我认为这是一个firefox实现问题),但我将在服务器端证明下一个代码:
header('Content-type: application/json');
确保浏览器将数据作为“json数据”...
答案 2 :(得分:4)
浏览器阻止您进行跨站点脚本编写。
如果网址位于您的域之外,则您需要在服务器端执行此操作或将其移至您的域中。
答案 3 :(得分:1)
这可能不是最好的方法。但它在某种程度上对我有用,所以我将继续使用它。
在我的php函数中返回数据,返回行前一行,我添加一个echo语句,回显我想发送的数据。
现在确定它为什么有效,但确实如此。
答案 4 :(得分:0)
与你的问题有类似的问题。我们要做的是使用这里找到的document.domain解决方案:
Ways to circumvent the same-origin policy
我们还需要在Web服务端更改。使用此处的“Access-Control-Allow-Origin”标题: