2012-06-09 12 views
5

Mam prosty plik HTML, który pobiera dane z serwera i wyjść to:Getting 0 jak 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> 

Plik, który znajduje się na serwerze, test.html wygląda tak:

<h1>Data received!</h1> 

Otrzymuję 0 jako status, mimo że w konsoli jest napisane, że wszystko jest w porządku i daje status 200. Po zmianie if (xmlhttp.status == 200) na if (xmlhttp.status == 0), po prostu wyprowadza The server replied with:. Dlaczego to? Czy coś mi się nie podoba? EDIT: To może być mój serwer, przejdę na inny. nagłówki mogą być pomocne:

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

Na marginesie, czy jesteś pewien, że 'alert' bierze wiele argumentów? – pimvdb

+3

to strona, do której wywołujesz to również z 'http: // new-host-2.home'? –

+0

Tak, jest. @IliaG –

Odpowiedz

1

funkcja alert zajmuje tylko jeden parametr, jesteś przejazdem 2.

Daj ten strzał:

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

Jeśli nadal nie działa , może to być problem z zabezpieczeniami: http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/282972/why-am-i-getting-xmlhttprequest.status0

Jeśli działa w Safari, spróbuj usunąć domenę w swoim żądaniu, aby ścieżka była względna. Firefox może pomyśleć, że próbujesz znaleźć coś między domenami.

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

nope, nie działa :( –

+1

@BobbyTables - umm ... OK, czy możesz rozwinąć? Co się stanie, gdy otworzysz przeglądarkę i przejdziesz do http: //new-host-2.home/test.html Czy coś jest wróciłem? –

+0

Klikam przycisk wprowadzania i nic się nie dzieje Kiedy wstawiam blok else, mówi, że xmlhttp.status to 0 –

1

Trudno powiedzieć, jaki jest dokładnie tutaj problem. Oto coś, co podejrzewam, że może być

1) Ta sama polityka hosta. Upewnij się, że strona, z której żądasz przesłania, znajduje się na tym samym hoście co dokładna. Na przykład jeden może być www., a drugi nie. Najprostszym sposobem jest pominięcie hostowej części adresu URL podczas tworzenia żądania AJAX.
xmlhttp.open("GET", "/test.html"); powinien po prostu działać.

2) Problemy z określaniem zakresu. Być może czytasz stan z innego obiektu niż ten, który zgłasza żądanie? Upewnij się, że czytasz ten sam obiekt, przechodząc od zdarzenia przekazanego do wywołania zwrotnego. Btw XMLHttpRequest i tak nie nadaje się do ponownego użycia, więc nie myśl, że oszczędzasz niektóre zasoby, czyniąc je globalnymi. Znacznie łatwiej jest zadeklarować to w funkcji startRequest.
Następnie zmień zwrotnego tak:

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

Istnieją pewne bardzo ładne owijarki dokonywania żądań AJAX (jQuery w szczególności), ale jeśli są wygięte na tworzyć własne (lub po prostu nauczyć wnętrzności), to jest ok, co chcesz:

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