我正在对外部网站进行简单的AJAX调用。它在IE中运行正常,但在Firefox中,不会返回响应文本。
我认为这可能与“chunked”的响应有关,但我不确定。
有什么想法吗?感谢。
<html>
<head>
<script type="text/javascript" charset="utf-8">
function loadXMLDoc() {
var xmlhttp;
var urlString = "http://drc.edeliver.com.au/ratecalc.asp?Pickup_Postcode=6025&Destination_Postcode=6055&Country=AU&Weight=100&Service_Type=STANDARD&Length=100&Width=100&Height=100&Quantity=2";
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4) {
window.alert(xmlhttp.responseText);
}
}
xmlhttp.open("GET", urlString, true);
xmlhttp.send();
}
</script>
</head>
<body>
<span onclick="loadXMLDoc()">Click Me</span>
</body>
</html>
答案 0 :(得分:4)
您的网页是否也在http://drc.edeliver.com.au托管?如果没有,那么您不能对该URL进行XMLHttpRequest。这违反了基本的浏览器安全性,对于IE测试,可能会被显式浏览器配置所抑制。
编辑 - 我认为IE让“本地安全区”(或他们称之为的任何东西)逃脱了“互联网”区域页面不允许的内容。
答案 1 :(得分:2)
您可能想尝试在urlString
中使用相对网址,以避免Same Origin Policy出现问题。
更新:对于评论,如果JSONP不是一个选项,您还可以设置一个简单的reverse proxy来绕过相同的原始政策。如果您使用的是Apache,则可以使用mod_proxy。这将允许您在AJAX请求中使用相对路径,而HTTP服务器将充当任何“远程”位置的代理。
在mod_proxy中设置反向代理的基本配置指令是ProxyPass。您通常会按如下方式使用它:
ProxyPass /remote/ http://drc.edeliver.com.au/
在这种情况下,浏览器可以请求/remote/ratecalc.asp
,但服务器可以通过充当http://drc.edeliver.com.au/ratecalc.asp
的代理来提供此服务,而浏览器似乎就像是从相同的起源。
答案 2 :(得分:1)
是的,分块响应(COMET流)可能是问题所在:
由于流仍然与许多问题相关联(例如,在使用代理时),我当前的建议是使用长轮询(关闭每个块的响应,并立即发出新请求)。这是一个不幸的情况 - 我也喜欢使用流媒体。
修改强>
我们发现,这实际上不是问题所在!
答案 3 :(得分:0)
我认为这个问题只是一个跨域安全的简单案例。
我正在尝试从本地静态HTML页面到外部URL进行AJAX调用。
IE允许我这样做。 Firefox不允许我这样做。
Firefox不提供错误消息(就像跨域iFrame DOM访问一样)。响应文本只是空的。
感谢大家的帮助。很抱歉发布这样一个狡猾的问题。
答案 4 :(得分:0)
对于跨域请求,请查看this article。
您可能需要启用以下标题才能在FF / Chrome中使用
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
答案 5 :(得分:0)
我也遇到了使用XMLHttpRequest的ajax问题,下面是帮助我的代码
var link=document.createElement('a');
link.href= url;
document.body.appendChild(link);
link.click();
setTimeout(function()
{
document.body.removeChild(link);
window.URL.revokeObjectURL(data);
}, 100);