DOM, setAttribute, évènements et Internet Explorer.

Mammouth du PHP | 19672 Messages

14 avr. 2006, 18:53

Salut tout le monde.

Si un gourou du DOM maîtrisant le fonctionnement interne de Internet Explorer a quelques secondes, voici mon problème.

Je crée un formulaire extensible en ce sens que j'ai des lignes de champs dont la dernière est toujours vide. Si je change la valeur du premier champ de cette dernière ligne, il y a un évènement onchange qui fait appel à une fonction qui crée une nouvelle ligne vide en dessous. La ligne en question est créée via le DOM avec createElement, setAttribute et ce genre de chose.

La fonction est parfaitement opérationnelle, mais... ben oui, ne rêvons pas, il y a un "mais", le système ne fonctionne bien qu'avec Firefox ou Opera : avec IE, je me heurte à un mystère : les attributs "style" ou les gestionnaires d'évènement du type "onchange" des lignes générées restent sans effet. J'ai bien entendu impérativement besoin de ce gestionnaire puisque, pour clarifier un peu, le premier champ est une liste déroulante à laquelle est liée une autre liste sur cette même ligne via un objet XHR.

Comment imposer à IE l'interprétation de ces attributs et de leurs valeurs dans les lignes générées.

Je précise qu'après vérification, les attributs sont bien présents et leurs valeurs également (sans toucher à la configuration du navigateur bien entendu, je n'ai pas accès à la machine de l'internaute). :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

15 avr. 2006, 13:54

Répondez pas tout à la fois, bande d'ingrats :langue:

Bon, la solution, trouvée avec la participation de quelques-uns sur developpez.com entre autre.

Le problème vient du navigateur et selon qu'il s'agit d'internet explorer ou d'un autre, il faut envoyer les données concernant les évènements sous une forme particulière. Il faut donc détecter à quel navigateur on a affaire et là, on peut envoyer l'attribut évènement. ça donne ceci par exemple:
//...
        var elt_11        = document.createElement('select');
        var isExplorer = ((navigator.userAgent.toLowerCase().indexOf('msie')!=-1) && (navigator.userAgent.toLowerCase().indexOf('opera') == -1)) ? true : false;
        if(isExplorer == true)
        {
            var idFP = "FamilleProduit"+ x;
            elt_11.onchange = function(){if(document.forms[0].elements[idFP].value != -1){list_f2_famille(x);ajout_ligne_f2(x);}};
        }
        else
        {
            elt_11.setAttribute("onchange", 'if(this.value != -1){list_f2_famille('+ x +');ajout_ligne_f2('+ x +');}');
        }
//... etc...
Mon gestionnaire d'évènement dans la ligne dynamique est maintenant parfaitement fonctionnel aussi bien sous IE que sous Firefox ou Opera. Notez dans le test de vérification que j'ai prévu de débusquer un Opera identifié en MSIE.

++
Cyrano
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: