Contenu qui s'efface après XmlHttpRequest

Résolu
Yoanned Messages postés 4 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 12 novembre 2007 - 9 nov. 2007 à 10:49
Yoanned Messages postés 4 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 12 novembre 2007 - 12 nov. 2007 à 10:37
Bonjour à tous !

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 !

Voici le code de ma page HTML :




<html>
<head>
<title>Test XMLHttpRequest</title>
<script language="javascript">



function submitForm(){



 var xhr = null;
   
 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 {



    }
  }
 }
 
 xhr.open('GET', 'http://www.site-distant.com/fichier.xml', true);
 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");                  
 xhr.send();
 
}



</script>
</head>






  ----

    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 !

Cordialement,
Yoanne

7 réponses

Yoanned Messages postés 4 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 12 novembre 2007
12 nov. 2007 à 10:37
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");
     }
   }
}
 
xhr.open('GET', 'fichier.xml', true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");                  
xhr.send();
 
}
</script>




</head>







  ----

    Liste des trucs :,
    <form name="form1" method="post" action="">
        <select id = "toto" name="toto">
        </select>
      </form>,
 









Merci PetoleTeam pour ton aide 
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 nov. 2007 à 12:27
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
 


;0)
0
Yoanned Messages postés 4 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 12 novembre 2007
9 nov. 2007 à 13:43
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 ?
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 nov. 2007 à 15:20
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;
(...)



;0)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 nov. 2007 à 15:21
petit problème avec l'éditeur qui a mangé l'espace entre option et value, je pense qu'il en a été de même pour toi donc ?...


;0)
0
Yoanned Messages postés 4 Date d'inscription vendredi 9 novembre 2007 Statut Membre Dernière intervention 12 novembre 2007
9 nov. 2007 à 15:38
Malheureusement non ça ne fonctionne pas... Je reste sur le tableau vide (sans la liste déroulante), et j'ai une erreur Javascript sur cette ligne :








Html += "<option value='" +element.firstChild.data +"'>" +element.firstChild.data +"</option>";







"Objet attendu".
J'ai bien fait attention à remettre l'espace, mais ce n'est pas cela !
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
9 nov. 2007 à 16:59
BOUUUUU! Réponse en vrac de ma part...

  //-- Récup contenu fichier
  Obj  = XML_Http.responseXML;
  Html = "<select>"
  //-- Récup des Tag
  Noeud = Obj.getElementsByTagName("region");
  //-- Parcours l'objet
  for( i= 0; i <Noeud.length; i++){
    //-- Récup des textes
    Html + = "<option>" + Noeud[i].firstChild.data + "<\/option>";
  }
  Html += "<\/select>";
 


;0)
0
Rejoignez-nous