XMLHTTPRequest & FF

Résolu
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009 - 18 mai 2009 à 14:26
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009 - 20 mai 2009 à 14:22
Bonjour à toutes et tous
je galère depuis plusieurs jours pour rendre compatible multi-navigateur un de mes scripts utilisant du XHR. Je suis allé fouiner un peu partout et je n'ai rien trouvé qui fonctionne correctement. Je veux remplir une div avec du code très simple (une table et une select avec méthode onclick). Rien de bien méchant. Ca marche sous IE, Opera, Chrome, Safari et Maxthon. Et pas sous FF ni NN. Je n'arrive pas à remplir le innerHTML à l'écriture ni, a fortiori, relire le textContent.

ci-après, extrait du code js qui s'occupe de dette fonction
<texte>
 
  function getText(id) {
    if(document.all) {
      return document.getElementById(id).innerText;
    }
    else {
      return document.getElementById(id).textContent;
    }
  }


  function videCases() {
    document.personne.titre.value = "";
    document.personne.nom.value = "";
    document.personne.prenom.value = "";
    document.personne.adresse1.value = "";
    document.personne.adresse2.value = "";
    document.personne.codepost.value = "";
    document.personne.ville.value = "";
    document.personne.pays.value = "";
    document.personne.telephone1.value = "";
    document.personne.telephone2.value = "";
    document.personne.sondage.value = "";
    document.personne.CliSOFFRES.value = "";
  }


  function ChangePers(num) {
    SetDisplay("choixMail","none");
    var liste = getText("listePersonnes");
    var ind = 14*num;
    var personnes = liste.split(";");
    var nbPers = 1*personnes[0];
    if (num<nbPers) {
      for (var t=1;t<5;t++) {
        var tit = getElm("tit"+t);
        if (tit.value==personnes[2+ind].rtrim()) tit.checked = true;
      }
      document.personne.nom.value = personnes[3+ind].toUpperCase().rtrim();
      var len = personnes[4+ind].length;
      document.personne.prenom.value = personnes[4+ind].charAt(0).toUpperCase()+personnes[4+ind].substr(1,len-1).rtrim();
      document.personne.adresse1.value = personnes[5+ind].rtrim();
      document.personne.adresse2.value = personnes[6+ind].rtrim();
      document.personne.codepost.value = personnes[7+ind].rtrim();
      document.personne.ville.value = personnes[8+ind].toUpperCase().rtrim();
      document.personne.pays.value = personnes[9+ind].toUpperCase().rtrim();
      document.personne.telephone1.value = personnes[10+ind].rtrim();
      document.personne.telephone2.value = personnes[11+ind].rtrim();
      document.personne.sondage.value = personnes[12+ind].replace(/,/g,";").rtrim();
      document.personne.CliSOFFRES.value = personnes[12+ind].replace(/,/g,";").rtrim();
      document.personne.idv.value = personnes[13+ind].rtrim();
      document.personne.ccli.value = personnes[14+ind].rtrim();
      getElm("listePersonnes").innerHTML = "";
      getElm("choixMail").innerHTML = "";
   }
    // si num=nbPers, c'est une nouvelle personne à cette adresse mail
  }
 
 function AffMail() {
   var liste = getText("listePersonnes");
   var personnes = liste.split(";");
   var nbPers = 1*personnes[0];
   var div = getElm("choixMail");
   if (nbPers==1) ChangePers(0);    
   else if (nbPers>0) {
     var nbElm = 1*nbPers+1;
     var select = "<select size='"+nbElm+"' onclick='ChangePers(this.options[selectedIndex].name);'>\r";
     var optSel = "<option selected name="";
     var option = "<option name="";
     var ferme = "">\r";
     var noitpo = "</option>\r";
     var tceles = "</select>\r";
     var index = 1;
     var listeOpt = "";
     for (i=0;i<nbPers;i++) {
       index = 3+(14*i);  // les coordonnées se répètent toutes les 14 valeurs
       var champsAff = "";
       for (j=2;j<9;j++) champsAff = champsAff + personnes[index+j]+"&nbsp;";
       listeOpt = listeOpt+option+i+ferme+personnes[index+1]+"&nbsp;"+personnes[index]+"&nbsp;"+champsAff+noitpo;
     }
     i++;
     listeOpt = listeOpt+option+i+ferme+"Nouvelle personne &agrave; cette adresse mail"+noitpo;
     select = select + listeOpt + tceles;
     div.innerHTML = ""+select+"
";
     SetDisplay("choixMail","");
   } // si 0, on vide
   else videCases();
 } 
 
 function checkMail(inst) {
   var email = getElm("email").value;
   var param = "inst="+inst+"&email="+email;
   Send_XHR_Object("site/getmail.php?"+param,"listePersonnes","D");
   AffMail();
 }

et dans le html, j'ai la déclaration des 2 div avec style='display:none'
</texte>

Toute aide est la bienvenue

Spinosaurus

12 réponses

PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
19 mai 2009 à 20:00
Bonjour,
essais en modifiant la fonction
checkMail comme suit
//-- fonction pour traiter la reponse.

  xhr_object.onreadystatechange = function() {
    if
(xhr_object.readyState==4) {
      //-- affichage
resultat
      getElm("listePersonnes").innerHTML =
xhr_object.responseText;
      AffMail();
    }
  }
  //-- envoi en asynchrone

  xhr_object.open("GET", "site/getMail.php?"+param, true);

  xhr_object.send(null);
;O)
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
18 mai 2009 à 14:39
Bonjour,

>>Je suis allé fouiner un peu partout et je n'ai rien trouvé qui fonctionne correctement.
???
ajax, ça fonctionne avec "tous" les navigateurs actuels
si ça ne fonctionnait pas avec FF, ça se saurait !

pas regardé très loin ce que tu nous met...
ne serait-ce que parce qu'on n'a pas Send_XHR_Object
dont dépend pas mal de choses

et loin d'être sûr que tu localises d'ailleurs bien ton souci...

en attendant plus de données :

<table id="aff" border="1" cellpadding="2" cellspacing="2">----
Navigateurs |Quelques Explications |----, Chrome

</td>contrôler page actuelle / Options pour développeurs
/ Console Javascript, ----
FireFox
, Outils / Console d'erreurs
et mieux : télécharger mon Site] [M'écrire] Bul
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
18 mai 2009 à 15:03
et déjà...
   Send_XHR_Object("site/getmail.php?"+param,"listePersonnes","D");
   AffMail();
AffMail va être lancé avant que Send_XHR_Object ne réponde
sans même parler si ajax est en synchrone ou pas !
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
18 mai 2009 à 15:42
Bul,
j'ai déjà regardé la console d'erreurs. Mis à part quelques styles css ignorés, pas d'erreur.
La fonction send_XHR_object attend la fin de la réponse (booléen mis à false systématiquement).
Je vais installer FireBug et voir plus loin. Je vais tester K-Meleon aussi.
Merci de tes réponses.

Spinosaurus
0

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

Posez votre question
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
18 mai 2009 à 16:09
>>La fonction send_XHR_object attend la fin de la réponse
peut-être,  sûrement, je veux bien te croire sur parole
mais je te disais : AffMail va être lancé avant que Send_XHR_Object ne réponde
tel que tu le fais!
le traitement de AffMail doit être fait dans la fonction
appelée dans "xhr".onreadystatechange lorsque que "xhr".readyState == 4
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
18 mai 2009 à 17:07
Voilà, j'ai changé mon code selon tes conseils.
<debut>
function checkMail(inst) {
   var email = getElm("email").value;
   var param = "inst="+inst+"&email="+email;
   var xhr_object = null; 
   if (window.XMLHttpRequest) {
     xhr_object = new XMLHttpRequest();  // Firefox    
   }
   else if (window.ActiveXObject) {
     xhr_object = new ActiveXObject("Microsoft.XMLHTTP");  // Internet Explorer
   }
   else {
     // XMLHttpRequest non supporté par le navigateur
     alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
     return;
   }
   var laDiv = getElm("listePersonnes");
   xhr_object.open("GET", "site/getMail.php?"+param, false); 
   xhr_object.onreadystatechange = function() {
     if (xhr_object.readyState==4) {
       laDiv.innerHTML = xhr_object.responseText;
       AffMail();
     }
   }
   xhr_object.send(null);
 }
<fin>

Fonctionne toujours sous IE, Opera, Safari, Maxthon et Chrome mais pas sur FF et NN, ni sur K-Meleon que je viens d'installer.

Spinosaurus
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
18 mai 2009 à 17:24
Correction de l'énoncé: le pb est même en amont de la div contenant une table et une select. Le première div contient tout simplement une string!
Ce n'est même pas du html.
Spinosaurus
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
19 mai 2009 à 10:01
qu'est-ce qui ne fonctionne pas ?
l'affichage dans la div ? si oui : erreur css ou html pour FF ?
lance le php directement ( sans passer par ajax )
        le résultat est correct ?
tu as fait des alert au fûr et à mesure ?
     alert(xhr_object.responseText;) ?  par exemple, c'est ok ?
tu as fait du pas à pas ?
tu peux nous donner une adresse pour tester ?
    car comme "on n'a pas tout".... difficile de voir.
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
19 mai 2009 à 10:18
Bonjour,


ce qui ne fonctionne pas, en effet, c'est le remplissage de la div, ou plutôt la récolte du contenu (responseText). Elle est normalement cachée, mais pour des raisons de debug, je la laisse visible. A part le "style='display:none' " quand elle est cachée, elle n'a aucun style rattaché (puisqu'elle n'est pas visible en temps normal). Le php lancé par la requête fonctionne sans problème. Alert(xhr_object.responseText) fonctionne sous IE et autres mais pas dans le cas de FF. Je ne peux pas mettre d'adresse à dispo car ce script n'est pas encore en ligne. Pour le pas-à-pas, je ne sais pas comment faire, je n'ai pas l'habitude de FireBug, je viens à peine de l'installer.
le code de la div (on ne peut faire plus simple)

Spinosaurus
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
19 mai 2009 à 18:07
Hello?


Y'a personne aujourd'hui?
Demain, alors?

Spinosaurus
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
20 mai 2009 à 11:08
Bonjour
Ok, merci, je vais essayer ça dans l'après-midi.

Spinosaurus
0
spinosaurus Messages postés 19 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 3 décembre 2009
20 mai 2009 à 14:22
C'est nickel!
Punaise, ça fait des jours que je galérais. Finalement, c'était une question d'ordre dans les instructions.
Maintenant, il ne me reste plus qu'à remplir les champs de mon formulaire avec les données voulues en JS.

Encore mille merci.

Spinosaurus
0
Rejoignez-nous