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

  1. #1
    Membre habitué 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
    Points : 177
    Points
    177
    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 habitué 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
    Points : 177
    Points
    177
    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 habitué 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
    Points : 177
    Points
    177
    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 habitué 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
    Points : 177
    Points
    177
    Par défaut
    Personne n'aurait un vieil IE ?

  5. #5
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    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+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  6. #6
    Membre habitué 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
    Points : 177
    Points
    177
    Par défaut
    J'avais aussi testé avec IE 6
    J'ai surtout peur avec IE 5 ...

    en tout cas merci

  7. #7
    Membre habitué 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
    Points : 177
    Points
    177
    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
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    ca marchais pas le getElementsById si tu ajoutais aussi un ID dynamiquement a tes options?

  9. #9
    Membre habitué 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
    Points : 177
    Points
    177
    Par défaut
    peut-pas, c'est un Framework qui me gére ce contenu dynamique, et j'ai interdiction de toucher directement aux sources, question de MàJ

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Normal que le script soit lent, il cherches dans tout les enfants de body.
    Si tu dois chercher des balises SELECT fait une fonction style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    inputType = "SELECT";
    nameToSearch = "nom1";
    function searchInput(inputType,nametoSearch)
    {
        Element = document.getElementsByTagName(inputType);
        for (var i = 0; i < Element.length; i++)
        {
          if(Element[i].name == nametoSearch)
          {
             return Element[i];
          }
        }
        return false;
    }
    Il ne cherchera que dans les input du type demandé, si pas trouvé retourne false.
    Attention non testé, ptet des erreurs de syntaxe.

  11. #11
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    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+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  12. #12
    Membre habitué 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
    Points : 177
    Points
    177
    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 ...

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 19
    Points
    19
    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é!

  14. #14
    Membre habitué 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
    Points : 177
    Points
    177
    Par défaut

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

  15. #15
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    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 ...
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  16. #16
    Membre habitué 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
    Points : 177
    Points
    177
    Par défaut
    C'est clair pour les appels récursifs, je vais voir ça aussi ...

    J'ai déjà une nette amélioration avec ç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
     
    function findElByName(nd,strName) {
      var val;
      var m=nd.childNodes.length ;
      for (var i=0;i<m ;++i) { 
        var nc = nd.childNodes[i];
        // find it ? 
        if (nc.name==strName) { 
          return nd.childNodes[i]; 
        } 
        // childNode ? 
        if ((nc.hasChildNodes()) && (nc.tagName != "OPTION")) { 
          val = findElByName(nc,strName);
          if (val) return val; 
        }
      } 
      return null; 
    }
    Je me suis référé à http://www.peachpit.com/articles/pri...p?p=31567&rl=1

  17. #17
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    coté "connaitre le TAG" ca reviens au meme la :p
    tu fais du recursif et quand tu tombe sur un option tu verifi le name.
    tu chercherai que les OPTIONS de ta page...

  18. #18
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par onclebob
    coté "connaitre le TAG" ca reviens au meme la :p
    tu fais du recursif et quand tu tombe sur un option tu verifi le name.
    tu chercherai que les OPTIONS de ta page...
    Heu ... non justement : je crois qu'ils descend tous les niveaux sauf les options (!= "OPTION")
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  19. #19
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    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+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  20. #20
    Membre habitué 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
    Points : 177
    Points
    177
    Par défaut
    oui, et ça ne fonctionne pas sur des elements créés dynamiquement

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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