我有一个简单的HTML文件,它从服务器获取数据并输出:
<html>
<head>
<script type="text/javascript">
var xmlhttp = new XMLHttpRequest();
function startRequest() {
xmlhttp.onreadystatechange = handleStateChange;
xmlhttp.open("GET", "http://new-host-2.home/test.html", true);
xmlhttp.send(null);
}
function handleStateChange() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
alert("The server replied with: ", xmlhttp.responseText);
}
else {
alert(xmlhttp.status);
}
}
}
</script>
</head>
<body>
<form>
<input type="button" value="Woooo" onclick="startRequest()"/>
</form>
</body>
</html>
服务器上的文件test.html如下所示:
<h1>Data received!</h1>
我一直把0作为一个状态,尽管在控制台中,它说一切都很好,并给出200状态。当我将if (xmlhttp.status == 200)
更改为if (xmlhttp.status == 0)
时,它只会输出The server replied with:
。为什么是这样?我搞砸了什么?
编辑:它可能只是我的服务器,我要切换到另一个。
标题可能会有所帮助:
Response Headers
Accept-Ranges bytes
Connection Keep-Alive
Content-Length 13
Content-Type text/html
Date Sat, 09 Jun 2012 14:17:11 GMT
Etag "267749b-d-4c20a6d0ef180"
Keep-Alive timeout=15, max=100
Last-Modified Sat, 09 Jun 2012 13:52:22 GMT
Server Apache/2.2.19 (Unix) DAV/2
Request Headers
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection keep-alive
Host new-host-2.home
Origin null
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0
答案 0 :(得分:1)
警报功能只接受一个参数,你传递2。
试一试:
var xmlhttp = new XMLHttpRequest();
function startRequest() {
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState==4)
{
if(xmlhttp.status==200)
alert("The server replied with: " + xmlhttp.responseText);
else
alert(xmlhttp.status);
}
}
xmlhttp.open("GET", "http://new-host-2.home/test.html", true);
xmlhttp.send();
}
如果仍然无效,则可能是安全问题:http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/282972/why-am-i-getting-xmlhttprequest.status0
如果它在Safari中有效,请尝试删除请求中的域以使路径相对。 Firefox可能会认为你正在尝试一些跨域的东西。
var xmlhttp = new XMLHttpRequest();
function startRequest() {
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState==4)
{
if(xmlhttp.status==200)
alert("The server replied with: " + xmlhttp.responseText);
else
alert(xmlhttp.status);
}
}
xmlhttp.open("GET", "/test.html", true);
xmlhttp.send();
}
答案 1 :(得分:1)
很难说这究竟是什么问题。以下是我怀疑它可能是
的东西 1)相同的主机政策。确保您要求的页面位于完全相同的主机上。例如,一个可能是www.
而另一个则不是。最简单的方法是在发出AJAX请求时省略URL的主机部分
xmlhttp.open("GET", "/test.html");
应该可以正常工作。
2)范围问题。也许你正在从一个不同于提出请求的对象中读取状态?通过从传递给回调的事件中获取它来确保您正在读取同一个对象。顺便说一句,XMLHttpRequest
无法重复使用,所以不要以为通过使其全球化来节省一些资源。在startRequest
函数中声明它会容易得多
然后像这样改变回调:
function handleStateChange(e)
{
var xmlhttp = e.target;
if (xmlhttp.readyState == 4)
{
if (xmlhttp.status == 200)
alert("The server replied with: " + xmlhttp.responseText);
else
alert(xmlhttp.status);
}
}
有一些非常好的包装器用于制作AJAX请求(尤其是jQuery),但是如果你一直想做自己的(或者只是学习内部),那么这大概是你想要的:
function startRequest(url, callback)
{
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange = function(e)
{
if (xmlhttp.readyState == 4 && xmlhttp.status >= 200 && xmlhttp.status < 300)
callback(xmlhttp.responseText);
};
xmlhttp.open("GET", url);
xmlhttp.send(null);
}
startRequest("/test.html", function(response) {alert("The server replied with: " + response);});