Pourquoi est-ce XMLHttpRequest échantillon de Mozilla ne fonctionne pas dans Firefox 3?
Je vais essayer d'obtenir le code d'exemple de Mozilla, qui consomme un service web REST fonctionne sous Firefox 3.0.10. Le code suivant ne fonctionne PAS dans Firefox, mais le fait dans IE 8!
- Pourquoi ça ne marche pas?
- Ne IE 8 du support de XMLHttpRequest? La plupart des exemples que j'ai vu utiliser l'ActiveX
l'allocation. Que dois-je faire? XMLHttpRequest semble de plus en plus standardisés.
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);
L'instruction open est en train de lancer une exception avec la description "indéfini". C'est étrange comme j'alloue la req objet, suis en cours d'exécution dans Firefox, et vérifié pour s'assurer qu'il est défini avant l'appel à open (dont il dit qu'elle est de type 'object').
J'ai aussi essayé la version asynchrone de ce avec pas de chance.
EDIT 2: ci-Dessous est mon plus récent code:
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: Bien, j'ai retravaillé ce en jQuery. jQuery fonctionne très bien sous IE, mais il jette 'Undefined' lors de l'exécution à partir de Firefox. Je double cochée et la case "Activer JavaScript" est activé dans Firefox semble bien fonctionner dans toutes les autres pages web. Ci-dessous est 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:
Bien, web leçon 101. Mon problème a été en effet inter-domaine. Je consulte mon site inédits (seulement sur le système de fichiers), qui a touché un service publiées. Quand j'ai publié mon site dans le même domaine, il a travaillé.
Qui soulève aussi une distinction importante entre IE et Firefox. Quand IE expériences de ce scénario, il demande à l'utilisateur de décider s'ils acceptent ou non la croix-domaine d'appel. Firefox lance une exception. Alors que je suis à l'aise avec une exception, un plus descriptif aurait été utile.
Merci pour tous ceux qui m'ont aidé.
- j'ai utilisé votre nouveau "légèrement modifié" code sur mon serveur. il fonctionne dans firefox 3. regarde ça: dogself.com/telluriumTest/test.htm j'ai seulement ajouté un meilleur système de connexion et de supprimer cette horrible document.écrire de la merde.
Vous devez vous connecter pour publier un commentaire.
à moins que " http://www.mozilla.org/ ' est le domaine à partir duquel cette demande émane, cette habitude de travail en raison de la même origine
edit:
Ok, un bon état est de 200, pas 0.
voir http://dogself.com/telluriumTest/ et cliquez sur "stackoverflow test". sa à l'aide de votre code et de travail.
spécifiquement ce code:
ne pas utiliser onreadystatechange lors de l'envoi synchrone demande ("faux"), mettre le gestionnaire à droite après le send() de la fonction. Il semble que FF ne pas exécuter la onreadystatechange fonction si la demande est synchrone.
http://support.mozilla.com/tiki-view_forum_thread.php?locale=ca&comments_parentId=124952&forumId=1
Je recommande fortement le asynchrones façon de le faire, une fonction coup d'envoi de la demande et une autre fonction gère la réponse.
C'est le format de base pour les appels ajax nous utilisons où je travaille, cela devrait fonctionner de la même chose pour Firefox, IE et Safari.
Note de côté: avez-vous des firebug? son une grande ressource pour le dépannage de javascript.
EDIT:
Essayez ce code à la place:
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 est écrit à droite du document, qui semble être en arrosant tout le code déjà écrit. dans cette version, je suis en train d'écrire à un div à la place.
pas sûr de ce qui se passe ici, mais je voulais juste que vous sachiez tous que quelqu'un de la documentation de Mozilla est de regarder ce afin d'être prêt à ajuster les docs si elle s'avère nécessaire, une fois que c'est compris.
Même, j'ai eu le même problème et c'était stupide erreur qui nous ne nous concentrons pas sur
le code marchait très bien sous IE, mais a eu des problèmes dans Chrome et Firefox
Initilly nous avons utilisé
Type="submit"
au lieu detype="button"
bien que le nous n'avons pas eu de problèmes de fonctionnalités comme la mise à jour de la table, mais nous avons été faireHTTP: error 0
dans la boîte d'alerte lorsque j'ai alertéreq.responseText
En utilisant le code ci-dessous résolu mon problème
Je suis tombé sur le même problème. La raison que IE fonctionne et pas les autres navigateurs est parce que IE vous permet d'ouvrir le fichier avec une URL du genre "C:\xampp\htdocs\project3\project3.html" les Autres navigateurs vont changer pour une URL de la forme "file:///C:/xampp/htdocs/project3/project3.html". Étant donné que le domaine de la fichier PHP doit être le même que le domaine de la fichier javascript IE fonctionne, mais les autres navigateurs ne le font pas. Assurez-vous que vous utilisez une URL de la forme "http://localhost/project3/project3.html". Veuillez noter que l'utilisation de localhost. Assurez-vous également que dans le javascript de votre appel que vous appelez le fichier PHP par le biais de localhost.
Autres que toutes les erreurs évidentes sur le côté client, la principale raison pour cela est que gecko le moteur de recherche le Access-Control-Allow-Origin dans l'en-tête de la servlet. Si elle ne le trouve pas, il va interrompre la communication et vous obtenez un status=0 et statusText=null. Aussi, le moz-nullprincipal en erreur d'analyse xml. Tout ça est très trompeur. Tous vous avez besoin pour résoudre ce problème est:
Dans le code de la servlet et la vie sera bonne 🙂
Remplacer la ligne
avec