2009-05-27 6 views
1

J'essaie d'obtenir l'exemple de code de Mozilla qui consomme un service Web REST pour fonctionner sous Firefox 3.0.10. Le code suivant ne fonctionne pas dans Firefox mais dans IE 8!Pourquoi cet exemple XMLHttpRequest de Mozilla ne fonctionne pas dans Firefox 3?

  1. Pourquoi cela ne fonctionne-t-il pas?
  2. IE 8 prend-il en charge XMLHttpRequest? La plupart des exemples que j'ai vus utilisent l'allocation ActiveX . Que devrais-je faire? XMLHttpRequest semble plus standardisé.

Exemple:

var req = new XMLHttpRequest(); 
req.open('GET', 'http://localhost/myRESTfulService/resource', false); // throws 'undefined' exception 
req.send(null); 
if(req.status == 0) 
    dump(req.responseText); 

La déclaration ouverte est de lancer une exception avec la description 'non défini'. C'est étrange car j'alloue l'objet req, je l'exécute dans Firefox, et je vérifie qu'il est défini avant d'appeler open (qu'il dit être de type 'object').

J'ai également essayé la version asynchrone de cela sans succès.

EDIT 2: Voici mon code le plus récent:

function createRequestObject() { 
    if(window.XMLHttpRequest) { 
     return new XMLHttpRequest(); 
    } 
    else if(window.ActiveXObject) { 
     return new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    return null; 
} 

function handleResponse(req) { 
    document.writeln("Handling response..."); // NEVER GETS CALLED 
    if(req.readyState == 0) { 
     document.writeln("UNITIALIZED"); 
    } 
    else if(req.readyState == 1) { 
     document.writeln("LOADING"); 
    } 
    else if(req.readyState == 2) { 
     document.writeln("LOADED"); 
    } 
    else if(req.readyState == 3) { 
     document.writeln("INTERACTIVE"); 
    } 
    else if(req.readyState == 4) { 
     document.writeln("COMPLETE"); 
     if(req.status == 200) { 
      document.writeln("SUCCESS"); 
     } 
    } 
} 

document.writeln(""); 
var req = createRequestObject(); 

try { 
    document.writeln("Opening service..."); 
    req.onreadystatechange = function() { handleResponse(req); }; 
    req.open('POST', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX 


    document.writeln("Sending service request..."); 
    req.send(''); 

    document.writeln("Done"); 
} 
catch(err) { 
    document.writeln("ERROR: " + err.description); 
} 

EDIT 3: D'accord, j'ai retravaillé cette jQuery. jQuery fonctionne très bien dans IE mais il lance 'Undefined' lorsqu'il est lancé depuis Firefox. J'ai coché et "Activer JavaScript" est activé dans Firefox - semble bien fonctionner dans toutes les autres pages Web. Voici le code jQuery:

function handleResponse(resp) { 
    alert("Name: " + resp.Name); 
    alert("URL: " + resp.URL); 
} 

$(document).ready(function() { 
    $("a").click(function(event) { 

     try { 
      $.get("http://localhost/services/ezekielservices/configservice/ezekielservices.svc/test", 
        "{}", 
        function(data) { handleResponse(data); }, 
        "json"); 
     } 
     catch(err) { 
      alert("'$.get' threw an exception: " + err.description); 
     } 

     event.preventDefault(); 
    }); 
}); // End 'ready' check 

Résumé de la solution:

D'accord, leçon web 101. Mon problème était en effet interdomaine. Je regardais mon site non publié (juste sur le système de fichiers) qui frappait un service publié. Lorsque j'ai publié mon site sous le même domaine, cela a fonctionné.

Ce qui soulève également une distinction importante entre IE et Firefox. Lorsque IE rencontre ce scénario, il invite l'utilisateur à accepter ou non l'appel inter-domaine. Firefox lève une exception. Bien que je sois d'accord avec une exception, une plus descriptive aurait été utile.

Merci à tous ceux qui m'ont aidé.

+0

J'ai utilisé votre nouveau code "légèrement modifié" sur mon serveur. il fonctionne dans Firefox 3. vérifier: http://dogself.com/telluriumTest/test.htm J'ai seulement ajouté une meilleure journalisation et supprimer cette horrible document.write merde. – mkoryak

Répondre

4

moins « http://www.mozilla.org/ » est le domaine à partir duquel cette demande provient, cela ne marchera pas à cause de même politique d'origine

modifier: Ok, un bon état est de 200, et non 0.

voir http://dogself.com/telluriumTest/ et cliquez sur "test stackoverflow". C'est en utilisant votre code et en travaillant.

spécifiquement ce code:

function test(){ 
    var req = new XMLHttpRequest(); 
    req.open('GET', 'index2.htm', false);  
    req.send(null); 
    if(req.status == 200) 
    alert("got some stuff back:"+req.responseText); 
} 
+0

D'accord, je vois ce que vous dites. J'ai essayé de frapper un fichier local et un service web local, et ça ne marche pas non plus. Cela fonctionne dans IE8 localement mais échoue dans Firefox. –

+0

vérifier ma dernière édition. votre code fonctionne pour moi – mkoryak

+0

de toute façon, pourquoi ne pas vous épargner quelques heures de maux de tête et utiliser jquery? – mkoryak

1

Je recommande fortement la manière asynchrone pour le faire, une fonction lance la demande et une autre fonction gère la réponse.Ceci est le format de base pour les appels ajax que nous utilisons où je travaille, cela devrait fonctionner de la même manière pour Firefox, IE et Safari.

Note au côté: avez-vous un firebug? C'est une excellente ressource pour le dépannage de javascript.

EDIT: Essayez ce code à la place:

<html> 
<head> 
<script> 
function out(outStr) // cheap and dirty output function 
{ 
    document.getElementById("out").innerHTML += "<br>" + outStr; 
} 

function handleResponse(req) { 
    if(req.readyState == 0) { 
     out("UNITIALIZED"); 
    } 
    else if(req.readyState == 1) { 
     out("LOADING"); 
    } 
    else if(req.readyState == 2) { 
     out("LOADED"); 
    } 
    else if(req.readyState == 3) { 
     out("INTERACTIVE"); 
    } 
    else if(req.readyState == 4) { 
     out("COMPLETE"); 
     if(req.status == 200) { 
      out(req.responseText); 
     } 
    } 
} 

function createRequestObject() { 
    var req = null 
    if(window.XMLHttpRequest) { 
     req = new XMLHttpRequest(); 
    } else if(window.ActiveXObject) { 
     req = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    return req; 
} 

function makeRequest() 
{ 
    var req = createRequestObject(); 

    try { 
     out("Opening service..."); 
     req.onreadystatechange = function() { handleResponse(req); }; 
     req.open('POST', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX 


     out("Sending service request..."); 
     req.send(''); 

     out("Done"); 
    } 
    catch(err) { 
     out("ERROR: " + err.description); 
    } 
} 
</script> 
</head> 
<body> 
<div onclick="makeRequest();">test<br></div> 
<div id="out">Output Here</div> 
</body> 
</html> 
Point

: http://localhost/test/test2.txt à un fichier existant sur votre serveur.

Vous ne savez pas exactement ce qui ne va pas avec votre code, mais il écrit directement sur le document qui semble arroser tout le code déjà écrit à cet endroit. Dans cette version, j'écris à la place à la place.

+0

J'ai essayé ce code exact. Fonctionne comme un champion dans IE mais pas Firefox. Je vais utiliser Firebug très vite et voir ce qui se passe ... –

+0

Voir mon code le plus récent ci-dessus ... –

+0

C'est TRÈS bizarre. Votre code mis à jour fonctionne très bien dans IE 8 mais j'ai "ERROR: undefined" dans Firefox. J'ai essayé ma solution originale mais l'ai modifiée pour utiliser plutôt jQuery ($ .get). Le jQuery fonctionne dans IE mais renvoie une erreur non définie dans Firefox ... c'est effrayant. –

1

ne sais pas ce qui se passe ici non plus, mais je voulais juste que vous sachiez que quelqu'un de la documentation de Mozilla regarde ceci pour être prêt à tordre les docs si cela s'avère nécessaire une fois que cela est compris.

+0

Génial! Tout pour aider à répandre le renard. Êtes-vous capable de reproduire le problème? –

+0

Cela fonctionne très bien dans la version nocturne de Firefox 3.5 Je cours ici. –

+0

Cela fonctionne aussi bien pour moi dans Firefox 3.0.3 (la dernière version de 3.0.x que j'ai sous la main sans faire de mise à niveau). –

1

Même j'avais même problème et il était stupide erreur que nous ne mettons pas l'accent sur le code fonctionnait très bien dans IE, mais a eu des problèmes dans Chrome et Firefox

Initilly nous avons utilisé Type="submit" au lieu de type="button" si le nous n'avions pas de problèmes de fonctionnalité comme la mise à jour des tables, mais nous obtenions HTTP: error 0 dans la boîte d'alerte quand j'ai alerté req.responseText En utilisant le code ci-dessous a résolu mon problème

input type="button" name="btnEdit5" id="btnEdit5" value="Confirm" onClick="show_confirm()" 
0

Outre toutes les erreurs évidentes du côté client, la principale raison à cela est que le moteur gecko recherche Access-Control-Allow-Origin dans l'en-tête du servlet. S'il ne le trouve pas, il annulera la communication et vous obtiendrez un status = 0 et statusText = null. En outre, moz-nullprincipal en erreur d'analyse XML. Tout cela est très trompeur. Tout ce que vous devez résoudre ce problème est:

response.setHeader("Access-Control-Allow-Origin","*"); 

Dans le code de servlet et la vie sera bonne :-)

0

Remplacez la ligne

req.open('POST', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX 

avec

req.open('GET', 'http://localhost/test/test2.txt', true); // WORKS IN IE8 & NOT FIREFOX 
0

J'ai rencontré le même problème. La raison pour laquelle IE fonctionne et aucun autre navigateur est parce que IE vous permet d'ouvrir le fichier avec une URL comme "C: \ xampp \ htdocs \ project3 \ project3.html" D'autres navigateurs vont changer cela en une URL comme "file: /// C: /xampp/htdocs/project3/project3.html ". Depuis le domaine du fichier PHP doit être le même que le domaine du fichier javascript IE fonctionne, mais pas les autres navigateurs. Assurez-vous que vous utilisez une URL comme "http: //localhost/project3/project3.html". S'il vous plaît noter l'utilisation de localhost. Assurez-vous également que dans votre appel javascript, vous appelez le fichier PHP via localhost.

Questions connexes