2012-06-09 20 views
5

Tengo un archivo HTML simple, que recibe los datos desde el servidor y le da salida:0 como el estado

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

El archivo que está en el servidor, test.html se ve así:

<h1>Data received!</h1> 

me siguen dando 0 como un estado, a pesar del hecho de que en la consola, que dice que todo está bien, y le da un estado 200. Cuando cambio if (xmlhttp.status == 200) a if (xmlhttp.status == 0), simplemente emite The server replied with:. ¿Por qué es esto? ¿Estoy arruinando algo? EDIT: Puede que solo sea mi servidor, voy a cambiar a uno diferente. Los encabezados pueden ser útiles:

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

Como nota al margen, ¿está seguro de que 'alerta' toma múltiples argumentos? – pimvdb

+3

es la página a la que llama desde también en 'http: // new-host-2.home'? –

+0

Sí, lo es. @IliaG –

Respuesta

1

función de alerta sólo se toma un parámetro, estás pasando 2.

dar a este un tiro:

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

Si aún así no funciona , podría ser un problema de seguridad: http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/282972/why-am-i-getting-xmlhttprequest.status0

Si funciona en Safari, intente eliminar el dominio en su solicitud para que la ruta sea relativa. Firefox podría estar pensando que estás intentando algo del dominio cruzado.

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

pues no, no funciona :( –

+1

@BobbyTables - umm ... OK ¿Puede explicar qué ocurre cuando se abre un navegador y vaya a http: //new-host-2.home/test.html es nada.? regresó? –

+0

hacer clic en el botón de entrada, y no pasa nada. Cuando pongo en un bloque más, se dice que es xmlhttp.status 0 –

1

Bastante difícil decir cuál es exactamente el problema aquí. Aquí hay algo cosas que sospechan que podría ser

1) la política de acogida mismo. Asegúrese de que la página que está solicitando está en el mismo mismo host. Por ejemplo, uno podría ser www. y otro no. La forma más sencilla de hacerlo es omitir la parte del host de la URL al realizar la solicitud de AJAX.
xmlhttp.open("GET", "/test.html"); debería funcionar.

2) cuestiones de ámbito. Tal vez estás leyendo el estado de un objeto diferente al que hace la solicitud? Asegúrese de leer el mismo objeto obteniéndolo del evento pasado a la devolución de llamada. Por cierto, XMLHttpRequest no es reutilizable de todos modos, así que no piense que está ahorrando recursos haciéndolo global. Mucho más fácil declararlo dentro de la función startRequest.
a continuación, cambiar de devolución de llamada de esta manera:

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

Hay algunas envolturas muy agradable para hacer peticiones AJAX (jQuery, en particular), pero si se empeñan en hacer su propia (o simplemente aprender las entrañas), entonces este es aproximadamente lo que quiere:

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