2009-04-15 13 views
9

J'essaye d'obtenir cette fonction pour fonctionner, qui fait une demande pour le paramètre url puis envoie le responseText à callback qui est une fonction.Ajax ne passera pas readyState 1, pourquoi?

Il semblerait que l'on arrive à readyState 1 (grâce aux commandes Firebug).

Ici, il est:

function Request(url, callback){ 
if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
    httpRequest = new XMLHttpRequest(); 
} else if (window.ActiveXObject) { // IE 
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
} else{ 
    return false; 
} 
httpRequest.onreadystatechange = function(){ 
    console.log(httpRequest.readyState); 
    if (httpRequest.readyState == 4) { 
     callback(httpRequest.responseText); 
    } 
}; 
console.log(httpRequest, url); 
httpRequest.open('GET', url, true); 
httpRequest.send(null); 
} 
+0

Salut Joe, je suis intéressé quelle était votre solution? Avez-vous trouvé un? Ma solution de contournement à ce prob assignait l'événement onload au lieu de onreadystatechange (voir les détails ci-dessous dans les réponses). –

+0

je ne sais pas .... désolé je n'ai pas été sur le site pendant un certain temps. Eh bien cela a fonctionné, mais je viens de passer à jQuery et ça fonctionne correctement. – kennyisaheadbanger

Répondre

3

Je contourné ce problème assignant événement onload au lieu de onreadystatechange:

function Request(url, callback){ 
if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
    httpRequest = new XMLHttpRequest(); 
} else if (window.ActiveXObject) { // IE 
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
} else{ 
     return false; 
} 

var readyStateChange = function(){ 
    console.log(httpRequest.readyState); 

    if (httpRequest.readyState == 4) { 
       callback(httpRequest.responseText); 
    } 
}; 


if (isFirefox && firefoxVersion > 3) { 
    httpRequest.onload = readyStateChange; 
} else { 
    httpRequest.onreadystatechange = readyStateChange; 
} 

console.log(httpRequest, url); 
httpRequest.open('GET', url, true); 
httpRequest.send(null); 
} 
+0

Console d'erreur: Uncaught ReferenceError: isFirefox n'est pas défini –

1

Peut-être la requête Ajax ne retourne pas de données (donc, une erreur côté serveur d'un certain type). Essayez d'activer l'option 'show XMLHttpRequests' dans la console firebug, pour vérifier cela.

+0

Eh bien c'est déjà allumé et j'enregistre l'objet http et l'inspecter me donne readyState 4, mais l'événement n'est pas appelé. Aussi la page renvoie les données correctement – kennyisaheadbanger

+0

oh! ça marche en safari mais pas firefox! c'est très étrange – kennyisaheadbanger

+0

Essayé de journaliser ma propre fonction lib xmlHTTP dans FF, pas de problème. Dans mon cas, j'utilise => if (httpRequest.readyState <4) {console.log (...);} else { [exec le rappel]}. – KooiInc

2

Vérifiez que l'URL en question répond réellement en la visitant directement dans le navigateur.

Testez avec un autre navigateur obtenez-vous le même résultat.

Utilisez une forme de surveillance HTTP pour regarder le client à la conversation serveur (mon préféré est Fiddler)

0

J'ai aussi fait face à la même problème. En lisant l'url ci-dessous, j'ai obtenu le mien résolu.

http://bytes.com/topic/javascript/answers/548442-ajax-readystate-1-wall

au fond, quand je cède ma fonction de l'écouteur d'événement pour httpRequest.onreadystatechange, je ne peux pas passer une variable à elle. SO que je dois intégrer la variable dans la chaîne HTTP POST au backend du serveur puis la récupérer à partir de la réponse HTTP.

Cela fonctionne très bien pour FF 3. Pas besoin d'utiliser jQuery.