Listes déroulantes imbriquées php/mysqp/javascript

cs_saille Messages postés 8 Date d'inscription vendredi 27 novembre 2009 Statut Membre Dernière intervention 15 février 2013 - 14 févr. 2013 à 14:35
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 15 févr. 2013 à 11:45
Bonjour,

J'ai 2 listes imbriquées Départements et Insee Villes.

Quand on sélectionne un département, les villes se chargent. Jusqu'ici ça fonctionne bien.

Aussi incroyable que l'on pourrait le croire, avec IE je récupère bien le "value" de mon code insee mais avec Firefox je n'ai pas de valeur, mon bouton de validation est bloqué et en plus un code erreur :
Erreur : TypeError: document.form01.CouInsee is undefined

Voici le code en javascript:
// GESTION DES LISTES IMBRIQUEES SUR 2 NIVEAUX
function getXhr(){
var xhr = null;
if(window.XMLHttpRequest){ // Firefox et autres
xhr = new XMLHttpRequest();
}
else if(window.ActiveXObject){ // Internet Explorer
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
xhr = false;
}
return xhr;
}
/**
* Méthode qui sera appelée sur le remplissage du département adresse courrier
*/
function ChargeCouInsee(){
var xhr = getXhr();
xhr.onreadystatechange = function(){
if(xhr.readyState 4 && xhr.status 200){
di = document.getElementById('CouInsee');
di.innerHTML = xhr.responseText;
}
}
xhr.open("POST","TableInsee.php",true);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
CodeDepartement = document.getElementById('CouDep').options[document.getElementById('CouDep').selectedIndex].value;
CodeListe = "CouInsee";
xhr.send("CodeDepartement="+CodeDepartement+"&CodeListe="+CodeListe);


TableInsee.php fonctionne correctement dans les 2 cas car la liste des villes est correctement alimentée.

Voici dans mon formulaire :
<tr>
<td colspan="4"> Département *
Ici la liste des départements
<select name ='CouDep' class= "liste" id='CouDep' onchange='ChargeCouInsee()'>
<option></option>
</select>
Code postal/Ville *
Ici la liste des insee et libellés des villes


<select name ='CouInsee' class="liste" id="CouInsee">
<option value=""> </option>
</select>

</td>
</tr>


Si quelqu'un peut m'aider, grand merci car je tourne en rond depuis pas mal de temps.

8 réponses

cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
14 févr. 2013 à 15:12
Salut, le mieux c'est de coder en jQuery. Tu rencontreras moins de difficulté dans la globalité.

stéph
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
15 févr. 2013 à 00:03
Sur quelle ligne l'erreur se produit-elle ? Je ne trouve pas de référence à document.form01.CouInsee dans ton code...

Sinon ce n'est pas une bonne idée de faire la requête AJAX totalement à la main. Idem pour les getElementById !
Je peux comprendre que tu ne veuilles pas utiliser jQuery (ou autres), mais passe au moins par des fonctions de ce genre :
function $i(id) {return document.getElementById(id);}

function $a(post, url)
{
    if (xhr = getXHR())
    {
        if (!post) xhr.open("GET", url, false);
        else
        {
            xhr.open("POST", url, false);
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        }

        xhr.send(post);
        if (xhr.readyState==4 && (xhr.status==200 || xhr.status==0))
            return xhr.responseText;
    }
}

//Gets an XMLHTTP object (cross-browser)
function getXHR() {
    var xhr = null;
    if (window.XMLHttpRequest || window.ActiveXObject)
    {
        if (window.ActiveXObject)
        {
            try {xhr = new ActiveXObject("Msxml2.XMLHTTP");}
            catch(e) {xhr = new ActiveXObject("Microsoft.XMLHTTP");}
        }
        else xhr = new XMLHttpRequest();
    }
    return xhr;
}
Ton code sera bien plus léger et facile à déboguer

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
15 févr. 2013 à 00:31
Salut @saille,

@ghuysmans99, j'imagine que mon poste ne compte pas ?
@saille n'a rien dit de ce genre "je ne veux pas utiliser jQuery ou autre".
De plus, tu n'as donnée aucune explication.
Donc, tu es hors sujet et arrogant en vers ma personne.

Si à la place, tu annonces un code qui contourne un bug retrouvé dans le code de @saille, c'est super.
Mais, tu dois piqué les développeurs qui t'entourent. C'est cela qui tu plais :).
Mais bon, j'ai pas testé, et bien-sûr, je suppose que tu n'es pas idiot à ce point.

A oui, je vais envoyer un e-mail aux développeurs de chez jQuery, je vais leur dire que jQuery, c'est pas top.
Ils vont certainement se remettre en question et prendre contact avec toi pour te demander des conseils de pro.

@saille, je te laisse entre de bonnes mains.

Mais, si tu veux, il y a une solution pour que cela soit compatible pour tout les navigateurs :
http://www.phpcs.com/forum/sujet-LISTES-DYNAMIQUES-LIEES_1626235.aspx

stéph
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
15 févr. 2013 à 00:39
Désolé, j'avais pas vu que tu avais 17 ans.
Je ne t’aurais pas traité d’idiot.
Mais fait attention à ta façon de parler STP.
On est pas ici pour ce battre, mais pour aider la communauté et peut-être encore apprendre quelque chose.
Mais tu m'as bien mis en colère.

stéph
0

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

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
15 févr. 2013 à 09:00
Bonjour stay,

Le but n'était pas de te blesser, loin de là. En lisant ton post, j'avais fini par penser (à tort)
qu'il voulait éviter jQuery. Donc sorry pour la réponse "à l'arrache" , le but n'était
pas de déclencher une guerre entre nous !

Jamais dit que cette bibliothèque n'était "pas top", j'ai juste proposé une alternative. Je reproche
un peu aux gens de proposer directement des frameworks à des nouveaux qui ne comprennent pas comment
ça se passe "à l'intérieur". Voilà pourquoi je préfère donc éviter de passer par là...

Les fonctions ici suivent la même logique que le code de saille (sauf que l'indentation est passée),
pas besoin d'explications à mon sens.

Je ne vois pas ce qu'il y avait d'agressif dans ma façon de parler, enfin...


PEACE

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
15 févr. 2013 à 09:48
Bonjour ghuysmans99, dans une conversation, comme en programmation, le détail compte.
J'ai proposé quelque chose d'intéressant et tu n'as pas rebondi correctement car j'ai été exclus sans explication et surtout pour les débutants imaginent le coté négatif de cette phrase.
De plus, la documentation proposé par les sites pour jQuery sont très simples à comprendre.
Pour moi, il est logique aujourd'hui qu'un développeur utilise des librairies pour les développements de ses projets.

Aujourd'hui, tu as des Frameworks pour le javascript, le css, le php, le java, etc...
Il est même possible de travailler en MVC coté client avec une librairie jQuery.
Et si tu dois juger de la vitesse ou du volume ou même à la relecture du code créé pour une application faite avec un Framework. Moi je vote pour. Et par rapport à mon expérience dans tout les développements "optimisé" de Back-Office sur le quel j'ai participé, le jQuery était toujours présent à très grande échelle.

Donc, il y a pas photo, exclure ma proposition sans explication était illogique à mon sens.
Mais vu ton attitude positive, je te laisse le bénéfice du doute et je retire ce que j'ai dit.

stéph
0
cs_saille Messages postés 8 Date d'inscription vendredi 27 novembre 2009 Statut Membre Dernière intervention 15 février 2013
15 févr. 2013 à 11:39
Bonjour,

Pour répondre à vos questionnements, à la validation, je vérifie que la zone est alimentée, elle l'est pour IE et pas pour Firefox.
J'ai même ajouté une "alert" pour voir la valeur de mon code insee :
if (document.form01.CouInsee.value=='')
{
var sel = document.form01.CouInsee.value;
alert(sel);
}

Mon alert est vide, et le bouton de validation bloqué.
J'ai vu l'erreur dans le menu devellopeur web --> Console d'erreur

Je ne suis pas contre JQUERY, je ne maitrise pas bien, mais si je peux être certain de ne pas avoir de problèmes de compatibilité, je prend.
Merci pour le lien, je vais regarder ceci de près.

Saille
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
15 févr. 2013 à 11:45
Cette lib est justement faite pour être compatible entre les différents navigateurs...
Ca t'évitera des problèmes comme celui que tu as maintenant : ici, tu as adressé un champ
par son nom alors qu'ils n'a qu'un ID. En général, c'est Firefox qui est assez sympa pour
te laisser faire, mais IE qui ne veut pas. Je ne sais pas pourquoi c'est l'inverse, enfin soit...

Utilise getElementById (ou ma fonction $i ou jQuery directement) pour adresser ton objet.

D'un autre côté, ton code n'a pas trop de sens : pourquoi if (xxx == '') et pas l'inverse ??

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Rejoignez-nous