【问题标题】:Getting 0 As Status获取 0 作为状态
【发布时间】:2012-06-13 06:22:17
【问题描述】:

我有一个简单的 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

【问题讨论】:

  • 附带说明,您确定alert 接受多个参数吗?
  • 是你在http://new-host-2.home上调用这个的页面吗?
  • 您是否尝试过从通过事件对象(而不是全局变量)传递的实例中读取状态?

标签: javascript html xml ajax http


【解决方案1】:

alert 函数只接受一个参数,你传递了 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(); 
} 

【讨论】:

  • @BobbyTables - 嗯...好的。你能详细说明吗?当您打开浏览器并转到 new-host-2.home/test.html 时会发生什么情况?有什么返回吗?
  • 我点击输入按钮,没有任何反应。当我放入一个 else 块时,它说 xmlhttp.status 是 0
  • 为什么要跳过else 部分?它不会使用readyState4 触发多次。
  • @BobbyTables - 当您使用浏览器直接进入页面时会发生什么?返回什么?
【解决方案2】:

很难说这里到底是什么问题。以下是我怀疑可能的事情

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);});

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 2017-05-13
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多