5

サーバーからデータを取得して出力する単純な 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>

コンソールではすべてが正常であると表示され、ステータスが 200 になっているにもかかわらず、ステータスとして 0 を取得し続けます。に変更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
4

2 に答える 2

1

アラート関数は 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(); 
} 
于 2012-06-09T14:06:36.627 に答える
1

ここで何が問題なのかを正確に言うのはかなり難しいです。ここに私がそれが疑わしいものがあります

1) 同じホスト ポリシー。リクエスト元のページがまったく同じホスト上にあることを確認してください。たとえば、1 つはそうでwww.、もう 1 つはそうでない可能性があります。これを行う最も簡単な方法は、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);});
于 2012-06-09T14:41:35.593 に答える