2012-06-09 11 views
5

Ich habe eine einfache HTML-Datei, die Daten vom Server bekommt und gibt es:Erste 0 als Status

<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> 

Die Datei, die auf dem Server ist, test.html wie folgt aussieht:

<h1>Data received!</h1> 

Ich bekomme immer 0 als Status, trotz der Tatsache, dass es in der Konsole sagt, alles ist in Ordnung, und gibt einen 200 Status. Wenn ich if (xmlhttp.status == 200) zu if (xmlhttp.status == 0) ändere, gibt es nur The server replied with: aus. Warum ist das? Verarsche ich etwas? EDIT: Es könnte nur mein Server sein, ich werde zu einem anderen wechseln. Die Header könnte hilfreich sein:

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

Als Randnotiz, bist du sicher, dass 'alert' mehrere Argumente braucht? – pimvdb

+3

ist die Seite, die Sie von diesem auch auf "http: // new-host-2.home" aufrufen? –

+0

Ja, ist es. @IliaG –

Antwort

1

Alarm-Funktion nimmt nur einen Parameter, du bist 2.

Geben Sie diesem einen Schuss vorbei:

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

Wenn es immer noch nicht funktioniert möglicherweise ein Sicherheitsproblem: http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/282972/why-am-i-getting-xmlhttprequest.status0

Wenn es in Safari funktioniert, versuchen Sie, die Domäne in Ihrer Anfrage zu entfernen, um den Pfad relativ zu machen. Firefox könnte denken, dass Sie etwas Cross-Domain-Zeug versuchen.

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(); 
} 
+0

nein, funktioniert nicht :( –

+1

@BobbyTables - ähm ... OK. Können Sie das ausarbeiten? Was passiert, wenn Sie einen Browser öffnen und zu http: //new-host-2.home/test.html gehen. Ist alles –

+0

Ich klicke auf die Eingabetaste, und nichts passiert.Wenn ich in einen Else-Block, heißt es, dass xmlhttp.status ist 0 –

1

Ziemlich schwer zu sagen, was genau ist das Problem hier. Hier sind einige Dinge, die ich vermute, dass es sein könnte

1) Gleiche Host-Politik. Stellen Sie sicher, dass die Seite, von der Sie es anfordern, sich auf dem exakten selben Host befindet. Zum Beispiel könnte man www. und andere nicht sein. Der einfachste Weg ist, den Host-Teil der URL wegzulassen, wenn die AJAX-Anfrage gestellt wird.
xmlhttp.open("GET", "/test.html"); sollte einfach funktionieren.

2) Scoping-Probleme. Vielleicht lesen Sie den Zustand von einem anderen Objekt als dem, der die Anfrage stellt? Stellen Sie sicher, dass Sie dasselbe Objekt lesen, indem Sie es von dem Ereignis abrufen, das an den Rückruf übergeben wurde. Btw XMLHttpRequest ist sowieso nicht wiederverwendbar, also denken Sie nicht, dass Sie einige Ressourcen sparen, indem Sie es global machen. Viel einfacher, es innerhalb der startRequest Funktion zu erklären.
Dann Rückruf wie folgt ändern:

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

Es gibt einige sehr schöne Wrapper für Anfragen (jQuery insbesondere) AJAX machen, aber wenn Sie auf eigene Faust zu machen (oder nur zu lernen, Innen) gebogen sind, dann ist dies approx was du willst:

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