Bug getElementsByName ( ) sous IE [Résolu]

Signaler
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
-
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
-
Bonjour à tous,
j'ai une question simple : connaissez-vous des bugs qui expliqueraient que sous Internet Explorer je n'arrive pas à compter le nombre d'objets ayant "artiste" pour Name ? Ca me renvoie toujours 0. Alors qu'évidemment ça marche parfaitement sous Firefox.

var p=document.getElementsByName('artiste').length;
alert(p);

merci d'avance !

14 réponses

Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19
Salut,

La fonction getElementsByName() utilise en fait l'attribut ID et non le NAME dans IE.
Rajoute ce qui est en gras.













Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Messages postés
13619
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
27
alors avec IE, dans le 2ème exemple, ça baigne pas :
            document.getElementsByName("artiste_1_sub").length = 0

si on met ID, comme suggéré par econs, bien entendu, il a raison : ça baigne

si on met textarea au lieu de tr.... ça baigne !

quelque chose m'échappe....
ou un bug du traitement des name sur TR par IE ?

cordialement   Bul    

Site

    

M'écrire
Messages postés
13619
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
27
et si c'est ces "sub" c'est un sous ensemble de artiste...
id="artiste_1"
   id="morceau_1_1"
   id="morceau_1_2"...
id="artiste_2"
   id="morceau_2_1"
   id="morceau_2_2"...
... on en tire les noms que l'on veut...
cordialement   Bul    Site    M'écrire
Messages postés
732
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
29 octobre 2007

Bonjour




Pour mettre mon grain de sel :
On ne peut pas vraiment parler de bug, dans la mesure où name n'est pas un argument standard de la balise <tr>. Pas étonnant donc que certains navigateurs n'acceptent pas de retourner quelquechose par getElementsByName. cf ici : http://fr.selfhtml.org/html/reference/attributs.htm#tr

(alors que id est un argument "universel", c'est à dire qu'il est utilisable pour quasiment toutes les balises HTML. Mais tu as raison, en principe un id est unique)

Pour "compter le nombre d'objets ayant "artiste" pour Name", je te suggère de consulter la fonction getElementByAttribute (http://www.robertnyman.com/2006/01/23/monday-code-giveaway-getelementsbyattribute/)

Cordialement
Roro webDev
Messages postés
13619
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
27
bonjour,

euh... chez moi, avec IE, tout baigne ?!!?
exemple tiré de SelfHtml ( alert ajouté, c'est tout )

<html><head><title>Test</title>
<style type="text/css">
<!--
.normal { font-style:normal }
-->
</style>
<script type="text/javascript">
<!--
 function cocher()
{
 document.getElementsByName("ingredient")[0].checked = true;
 alert(document.getElementsByName("ingredient").length);
}
//-->
</script>
</head>
<form name="formulaire" action="">
Salami

champignons

olives

</form>
</html>

cordialement   Bul    

Site

    

M'écrire
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Bonjour, merci de m'avoir répondu aussi rapidement.

Après vérification, vous avez tous les deux raisons :

econs --> j'ai testé avec les id, c'est effectivement ça qu'il compte. Mais c'est embêtant, car théoriquement on n'est pas censé donner le même ID à plusieurs objets, même si ça marche.

Bultez --> getElementByName marche dans d'autres cas, je l'utilise moi-même souvent.

Alors je vous livre deux morceaux de code si vous voulez faire le test :
Le premier est celui de ma page en entier, le get Name ne marche pas.
Le deuxième est le même code où j'ai supprimé tout ce qui était superflu par rapport au getName. Et là ça marche.
Il y a donc une interférence quelque part. Je n'ai malheureusement pas le temps techniquement de faire un débuggage, donc je vais me débrouiller avec les ID.

J'attends un petit peu avant d'accepter vos réponses, si vous aviez d'autres suggestions avant. Merci encore

PS: pour tester le code, appuyez sur le deuxième P

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

<head>
    <title>Music Test</title>
    <meta name="robots" content="index,nofollow">
    <link href="styles_communs.css" rel="stylesheet" type="text/css">
    <link href="styles_disco.css" rel="stylesheet" type="text/css">
   
    <script>
       
        function expand(i){
            if(expand[i] == '0'){
                document.getElementById('img_'+i).src='./images/moins.gif';
                expand[i] = '1';
                var taille = document.getElementsByName('artiste_'+i+'_sub').length;
                for(j=0; j<taille; j++){
                    document.getElementsByName('artiste_'+i+'_sub')[j].style.display = 'none';
                }
            }
            else {
                document.getElementById('img_'+i).src='./images/plus.gif';
                expand[i] = '0';
                var n = document.getElementsByName('artiste_'+i).length;
                alert(n);
                for(j=0; j<n; j++){
                    //document.getElementsByName('artiste_'+i+'_sub')[j].style.display = '';
                }
            }
        }   
   
   
        var l=0;    // l est la chanson de libre écoute active
       
        function highlight(i){
            if(i!=l){
                document.getElementById('morceau_'+i).className='tr_selected';
            }
        }
       
        function unhighlight(i){
            if(i!=l){
                document.getElementById('morceau_'+i).className='';
            }
        }
       
        function select(i){
            if(i!=l){
               
                highlight(i);

                m=l;
                l=i;
                if(m!=0){
                    unhighlight(m);
                }
               

            }
        }
   
        function check(){
            var p=document.getElementsByName('artiste_1_sub').length;
            alert(p);
        }
   
    </script>
 
</head>

   

   

   

   

   
   

   
        ArtisteAlbumEcoutesSuppr.
       
       

                            <tr id=\"artiste_1\">
                    [styles_communs.css
    <link href="styles_disco.css" rel="stylesheet" type="text/css">
   
    <script>

   
        function check(){
            var p=document.getElementsByName('artiste_1_sub').length;
            alert(p);
        }
   
    </script>
 
</head>

                                <tr id=\"artiste_1\">
                    ] Sheryl Crow,
                    ,
                    ,
                    ,
               
                <tr name=\"artiste_1_sub\" id=\"morceau_1\" onmouseover=\"highlight('1');\" onmouseout=\"unhighlight('1');\" onclick=\"select('1');\">
                    Strong enough,
                    Tuesday night music club,
                    3,
                    su,
               
                <tr name=\"artiste_1_sub\" id=\"morceau_2\" onmouseover=\"highlight('2');\" onmouseout=\"unhighlight('2');\" onclick=\"select('2');\">
                    Strong enough,
                    Tuesday night music club,
                    3,
                    su,
               
                <tr name=\"artiste_1_sub\" id=\"morceau_3\" onmouseover=\"highlight('3');\" onmouseout=\"unhighlight('3');\" onclick=\"select('3');\">
                    Strong enough,
                    Tuesday night music club,
                    3,
                    su,
               
                ----

                    <a href="javascript: void(0)" onclick="check();"> Sheryl Crow,
                    ,
                    ,
                    ,
               

               
           

</html>
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
J'ai un peu honte de cette solution, mais ça marche bien sous IE et Firefox si j'écris :

                <tr name="artiste_1_sub" id="artiste_1_sub" id="morceau_1">
                </tr>
                <tr name="artiste_1_sub" id="artiste_1_sub" id="morceau_2">
                </tr>

eh oui, il y a bien 2 identiques et en plus 2 id par objet. J'ai peur que ça ne passe pas sur d'autres navigateurs mais bon, en attendant mieux...
Messages postés
13619
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
27
mais plutôt que getelementByName,
pourquoi ne pas utiliser formulaire.artiste_1_sub ?
et si 1 "est variable" formulaire["artiste_"+numero+"_sub"]... 
      par exemple.
là syntaxe valide et ça fonctionne pour tous (?) les navigateurs
mais enfin... pas satisfaisant pour getElementByName.
cordialement   Bul    
Site
    
M'écrire
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
ha non, je retire ce que j'ai dit, ça bloque une autre fonction. Et j'ai besoin de garder les id tels qu'ils existent déjà.
arg au secours !
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Merci Bultez, j'essaie tout de suite !
je n'ai pas du tout les réflexes Javascript : moi je me voyais partir dans le dom ou les champs cachés... à tout de suite
Messages postés
13619
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
27
moi aussi, j'ai dit une connerie (**)
même avec frm["nom"] avec IE, çà ne semble pas marcher.
met des id différents ?
id="


"artiste_1_sub", id"="artiste_2_sub",....
et une boucle
i=1;
while document.getElementById("artiste_"+i+"_sub")
{
   traitement de document.getElementById("artiste_"+i+"_sub")
   i++;
}
cordialement   Bul   
 Site    M'écrire
** c'est pas la 1ère, mais je puis affirmer
que ce ne sera pas la dernière.
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Tu m'as sauvé la vie Bultez ! et c'est pas la première fois :^)
Effectivement la solution était de jouer sur les variations d'ID.
Merci infiniment pour le temps que tu as passé sur mon problème.

Par contre, message à Internet Explorer : si un jour je te croise dans la rue... ^^

à+
Messages postés
13619
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
27
merci du retour Evangun,
   sauvé la vie peut-être pas....   
   tous les navigateurs ont "des défauts",
   certains de ces défauts peuvent (?) être considirés comme des "bugs".
cordialement   Bul 
   Site    M'écrire
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Merci Roro, j'avais justement pensé à une fonction comme celle-là, et getElementByType par exemple ne marchait pas. Je pense que celle-ci me servira souvent. Il me semble en revanche que le .all n'est pas très correct niveau dom, non ? enfin c'est pas grave, je la réécrirai un jour s'il le faut
merci !