Je suis débutant en Javacript, et je m'arrache les cheveux sur un problème que je ne sais pas résoudre...
J'essaie de récupérer des informations depuis un fichier XML distant, et de les placer dans une liste déroulante ; ce que je suis arrivé à mettre en place avec XmlHttpRequest en récupérant des morceaux de code à gauche à droite. Pour faire simple et pour tester déjà, j'ai fait sur ma page HTML un tableau de deux cellules, avec dans la cellule de gauche un simple texte, et dans la cellule de droite mon résultat de fonction Javascript, c'est à dire ma liste déroulante.
Seulement, j'ai un problème "d'affichage". Lorsque je charge ma page, je tombe tout d'abord sur mon tableau, mais sans la liste déroulante, ce qui me semble normal puisque la fonction n'a pas encore renvoyé le résultat. Puis, au bout d'une demi-seconde, ma page se recharge... et je n'ai plus que ma liste déroulante.
Vous en conviendrez donc que si mon code Javascript efface le reste de la page, cela va poser un problème !
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
// Firefox, Safari, ...
} else if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
// Internet Explorer
} else {
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xhr = false;
}
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status == 200) {
var doc = xhr.responseXML;
document.write("<select>");
for (i=1; i<=50; i++){
var element = doc.getElementsByTagName('TRUCS').item(i);
document.write("<option value='"+element.firstChild.data+"'>"+element.firstChild.data+"</option>");
}
document.write("</select>");
} else {
Liste de TRUCS :,
<script>window.onLoad(submitForm());</script>,
</html>
Voilà donc ce code qui me fait désespérer...
En espérant que tout ceci vous inspire plus que moi, je vous remercie beaucoup de votre attention et de vos éventuelles réponses !
J'ai résolu mon problème !
Et ce de la manière suivante :
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if(xhr.status
== 200) {
var doc = xhr.responseXML;
var test = doc.getElementsByTagName('trucs').length
for (i=0; i<=test-1; i++){
var element = doc.getElementsByTagName('trucs').item(i); //Ici, truc est la valeur du nœud dans le fichier XML
document.getElementById("toto").options[i] = new Option(element.firstChild.data, element.firstChild.data);
//document.getElementById("toto").add(new Option(element.firstChild.data,element.firstChild.data)); -->
}
} else {
alert("erreur");
}
}
}
Bonjour,
Normal... il ne faut pas utiliser document.write qui clear le contenu du document, mais écrire ton résultat dans un div par exemple avec innerHTML
Bonjour PetroleTeam !
J'ai essayé de mettre en place la solution en innerHTML de la manière suivante :
(...)
var doc = xhr.responseXML;
output.innerHTML = "<select><option>--- Vide ---</option>";
for (i=1; i<=50; i++){
var element = doc.getElementsByTagName('region').item(i);
output.innerHTML+="<optionvalue='"+element.firstChild.data+"'>"+element.firstChild.data+"</option>";
}
output.innerHTML+="</select>";
(...)
Et plus loin, entre les balises BODY :
(...)
----
Résultat de TRUCS :,
<script>window.onLoad(submitForm());</script>
,
(...)
Donc tout ceci m'affiche bien mon SELECT avec à l'intérieur ma ligne "--- Vide ---"... mais uniquement cela ! Et juste à côté j'ai la liste de mes résultats qui auraient dû être dans le SELECT, mais au format texte en ligne, comme entre balises
.
Ais-je fais uen bétise dans le innerHTML, ou est-ce finalement une mauvaise piste ?
Peut être avec cela...
(...)
var doc = xhr.responseXML;
var Html = "<select><option>--- Vide ---</option>";
var O_Region = doc.getElementsByTagName('region');
for (i=1; i<=50; i++){
var element = O_Region.item(i); Html +"< option <gras>value</gras>'" +element.firstChild.data +"'>" +element.firstChild.data +"</option>";
}
//-- pour plus de compatibilite
document.getElementById( 'output').innerHTML = Html;
(...)