IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[IE vs FF] getElementsByName sur objet dynamique


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut [IE vs FF] getElementsByName sur objet dynamique
    Bonjour à tous,

    Je dois avoir accés à des <select> par leur "NAME", combobox ajoutés dynamiquement.
    Le getElementsByName fonctionne très bien sur Firefox, mais pour cet en**phariné de IE ... il me renvoie un ô douloureux "undefined" ...


    Il me semblait qu'il ne faisait pas la distinction entre l'ID et le NAME,
    j'ai donc mit au début de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // getElementsByName() pour IE :
     if (navigator.appName == "Microsoft Internet Explorer" ) {
         document.getElementsByName = function(name) {
           var tab = new Array();
           tab[0] = document.getElementById(name);
           return tab;
         }
     }
    mais ça ne fonctionne pas...

    Y a t-il une solution ?

    merci

  2. #2
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Bonjour à tous,
    après moultes péripéties, j'ai réussi à coder ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function findElByName(nd,strName) { 
      for (var i=0;i<nd.childNodes.length;++i) { 
     
    		// find it ? 
        if (nd.childNodes[i].name==strName) { 
          return nd.childNodes[i]; 
                    } 
     
    			// childNode ? 
    				if ((nd.childNodes[i].hasChildNodes()) && (nd.childNodes[i].tagName != "OPTION")) { 
              var val = findElByName(nd.childNodes[i],strName);
              if (val) return val; 
            } 
      	} 
     
      return null; 
     
    }
     
    // Définition d'un getElementsByName sur objet dynamique pour IE :
    if (navigator.appName == "Microsoft Internet Explorer") { 
      document.getElementsByName = function(str) { 
        var o = findElByName(document.body,str); 
        if (o) { 
          return new Array(o); 
        }
        return undefined; 
    	} 
    }
    Ca fonctionne très bien sur ma version de IE, mais je ne dispose pas d'anciennes versions...
    est-ce que quelqu'un voudrait tester sur des versions plus anciennes ?
    D'avance merci,
    TSalm

  3. #3
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Voici un petit code pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <html> 
    <head></head> 
    <body>
    <table>
    <tr><td><select name="selTest"><option value="a"/></select><select name="selTestA"><option value="a"/></select></td><td id="inThis"></td></tr>
    </table>
    </body> 
    <script language="javascript"> 
     
    // <<< BEGIN INSERT 
     
      var values = new Array("a","b","c"); 
     
            var inputElementName = "SELECT"; 
            var input = document.createElement(inputElementName); 
     
            input.setAttribute('name', "test.test[0]"); 
     
            for (i=0;i<values.length; i++) { 
             var option = document.createElement("OPTION"); 
             option.setAttribute("value",  values[i]); 
             option.innerHTML = values[i]; 
             input.appendChild(option); 
            } 
     
            document.getElementById("inThis").appendChild(input); 
    //  END >>> 
     
     
     
    // <<< 
    function findElByName(nd,strName) { 
    //  txtTest += "*Node taille : "+nd.childNodes.length+"<br/>";
      for (var i=0;i<nd.childNodes.length;++i) { 
    	// find it ? 
        	if (nd.childNodes[i].name==strName) { 
          	return nd.childNodes[i]; 
          } 
     
          // childNode ? 
          if ((nd.childNodes[i].hasChildNodes()) && (nd.childNodes[i].tagName != "OPTION")) { 
          	val = findElByName(nd.childNodes[i],strName);
          	if (val) return val;
     
          } 
      } 
     
      return null; 
     
    } 
     
    if (navigator.appName == "Microsoft Internet Explorer") { 
      document.getElementsByName = function(str) { 
        o = findElByName(document.body,str); 
        if (o) { 
          return new Array(o); 
        } 
        return undefined; 
      } 
    } 
     
    // >>> 
     
    obj = document.getElementsByName("test.test[0]");
    if (obj[0]) alert(obj);
     
    </script> 
    </html>
    Si ça fonctionne, il affiche [object] dans une boite de dialogue
    , sinon je pense qu'il n'affiche rien...

  4. #4
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Personne n'aurait un vieil IE ?

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    Citation Envoyé par TSalm
    Si ça fonctionne, il affiche [object] dans une boite de dialogue
    N'ayant pas trouvé quelle était la version déjà testée (7 ?), j'ai testé avec IE6 => OK !

    A+

  6. #6
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    J'avais aussi testé avec IE 6
    J'ai surtout peur avec IE 5 ...

    en tout cas merci

  7. #7
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    J'ai aussi remarqué que ce script est lent ... quelqu'un voit une façon de le rendre plus rapide ?

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Voire même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element = document.getElementById('id_conteneur').getElementsByTagName(inputType);
    s'ils sont tous dans un même conteneur (un <div>, par ex.)

    A+

  9. #9
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    bon, ce n'est pas là que ça ralenti, cette portion de code est juste faite pour ajouter un élément dynamiquement (en l'occurrence, un SELECT).
    C'est dans la fonction findElByName que le bas blesse ...

  10. #10
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Par défaut
    Oui oui la fonction qu'on te proposes est un remplacement de findElByName!
    ton findElByName parcoure tout les elements du dom et c'est normal qu'elle soit lente.
    si tu veux comprendre pourquoi remplace

    if (val) return val;

    par

    if (val)
    {
    alert(i);
    return val;
    }

    tu vas "voir" le nombre d'element qu'il a checké!

  11. #11
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut

    ce qui demande de connaître le type du TAG, c'est super embêtant...

  12. #12
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par TSalm

    ce qui demande de connaître le type du TAG, c'est super embêtant...
    Tant que ça ?
    Parce que les appels récursifs, c'est lourd aussi ...

  13. #13
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Je reviens à ton 1° post parce que je crois qu'on s'est un peu écarté et qu'on complique pour rien.
    Effectivement IE est le seul à mélanger name et id : pas pour ça qu'il faut en profiter
    Par contre getElementsByName() retourne un tableau (car contrairement aux ID, plusieurs obkets peuvent avoir le même name dans ta page.
    Tout ça pour dire : tu as essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[0] = document.getElementsByName(name)[0]


    A+

  14. #14
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    oui, et ça ne fonctionne pas sur des elements créés dynamiquement

  15. #15
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par TSalm
    oui, et ça ne fonctionne pas sur des elements créés dynamiquement
    Parce que ta fonction est générée dynamiquement, pas à cause de l'objet qui a le name ...
    Essaye en faisant un fonction "normale" (sans essayer de redéfinir getElementsByName).

    A+

  16. #16
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bon, je débarque un peu dans ta discussion....

    Si j'ai bien compris tu cherches à accèder à des éléments créé dynamiquement par leur name sous IE getElementsByname te cause des soucis.

    Je peux voir ton script qui créé tes éléments ?


    Et puis si ça t'intéresse j'ai IE5

  17. #17
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Par défaut
    une sombre histoire de .name en majuscule ou minuscule tu penses?

  18. #18
    Membre éclairé Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Par défaut
    Faut pas avoir honte d'avoir IE5, faut juste avoir honte de n'avoir QUE IE5

    J'ai posté du code pour test (mon 3 message dans ce fil)
    Pour voir la différence, il suffit d'enlever la redefinition du getElementsByName

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion des évènements sur objets dynamiques
    Par boss_gama dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/03/2009, 11h50
  2. Réponses: 7
    Dernier message: 07/03/2008, 10h01
  3. Utiliser une CssClass sur objet dynamique
    Par starkson dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/07/2007, 09h54
  4. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo