J'utilise XMLHttpRequest
en JavaScript. Cependant, cela me donne une erreur et je ne sais pas quel est mon problème.
Je dois analyser un fichier XML et attribuer son contenu à la page Web - voici mon code:
<script = "text/javascript">
window.onload = onPageLoad();
var questionNum = 0;
function onPageLoad(questionNum) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","quiz.xml");
try {
xmlhttp.send(null); // Here a xmlhttprequestexception number 101 is thrown
} catch(err) {
document.getElementById("body").innerHTML += "\nXMLHttprequest error: " + err.description; // This prints "XMLHttprequest error: undefined" in the body.
}
xmlDoc = xmlhttp.responseXML;
parser = new DOMParser(); // This code is untested as it does not run this far.
}
</script>
Mon fichier XML est dans le même répertoire.
<question>
<query>what is 2+2?</query>
<option>4</option>
<option>5</option>
<option>3</option>
<answer>4</answer>
</question>
À titre de référence, je programme généralement en C # ou en Java et j'utilise mon site Web sous Google Chrome.
Donc, il y a peut-être quelques choses qui ne vont pas ici.
Commencez tout d'abord par lire comment utiliser XMLHttpRequest.open()
car il existe un troisième paramètre facultatif permettant de spécifier si une requête asynchrone doit être effectuée, , la valeur par défaut étant true . Cela signifie que vous effectuez une requête asynchrone et que vous devez spécifier une fonction de rappel avant de procéder à la fonction send()
. Voici un exemple de MDN :
var oXHR = new XMLHttpRequest();
oXHR.open("GET", "http://www.mozilla.org/", true);
oXHR.onreadystatechange = function (oEvent) {
if (oXHR.readyState === 4) {
if (oXHR.status === 200) {
console.log(oXHR.responseText)
} else {
console.log("Error", oXHR.statusText);
}
}
};
oXHR.send(null);
Deuxièmement, comme vous obtenez une erreur 101, vous pouvez utiliser une mauvaise URL. Assurez-vous donc que l'URL avec laquelle vous faites la demande est correcte. Assurez-vous également que votre serveur est capable de servir votre quiz.xml
fichier.
Vous devrez probablement déboguer en simplifiant/réduisant le problème. Je commencerais donc par une requête synchrone simple afin que vous n'ayez pas à vous soucier de la fonction de rappel. Voici donc un autre exemple de MDN pour effectuer une requête synchrone:
var request = new XMLHttpRequest();
request.open('GET', 'file:///home/user/file.json', false);
request.send(null);
if (request.status == 0)
console.log(request.responseText);
De plus, si vous débutez avec Javascript, vous pouvez vous référer à MDN pour la documentation/les exemples/les tutoriels de l'API Javascript.
Je vois 2 problèmes possibles:
Problème 1
Solution: attribuer une fonction de rappel aux objets "onreadystatechange" -event et gérer les données de cette fonction
xmlhttp.onreadystatechange = callbackFunctionName;
Une fois que state a atteint DONE (4), le contenu de la réponse est prêt à être lu.
Problème 2
Solution: utilisez un try-catch pour créer le bon objet pour le navigateur approprié (ActiveXObject dans IE) ou utilisez un cadre, par exemple méthode jQuery ajax
Remarque: si vous décidez d’utiliser jQuery méthode ajax, vous affectez la fonction de rappel à jqXHR.done ().
Le problème est probablement lié à la ligne:
window.onload = onPageLoad();
En incluant les crochets, vous dites que onload
devrait être égal à la valeur de retour de onPageLoad()
. Par exemple:
/*Example function*/
function onPageLoad()
{
return "science";
}
/*Set on load*/
window.onload = onPageLoad()
Si vous imprimez la valeur de window.onload
Sur la console, ce sera:
science
La solution est de supprimer les crochets:
window.onload = onPageLoad;
Donc, vous utilisez onPageLoad
comme référence à la fonction ainsi nommée.
Enfin, pour obtenir la valeur de réponse, vous aurez besoin d'un écouteur readystatechange
pour votre objet XMLHttpRequest
, car il est asynchrone:
xmlDoc = xmlhttp.responseXML;
parser = new DOMParser(); // This code is untested as it doesn't run this far.
Ici vous ajoutez l'auditeur:
xmlHttp.onreadystatechange = function() {
if(this.readyState == 4) {
// Do something
}
}