Bug getElementsByName ( ) sous IE

Résolu
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
- 22 août 2006 à 08:17
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
- 27 août 2006 à 16:21
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

econs
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
23
22 août 2006 à 08:30
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.
3
cs_bultez
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
22 août 2006 à 15:53
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
3
cs_bultez
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
22 août 2006 à 16:14
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
3
cs_roro06
Messages postés
732
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
29 octobre 2007

25 août 2006 à 10:04
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
3

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

Posez votre question
cs_bultez
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
22 août 2006 à 10:22
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
0
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
22 août 2006 à 15:27
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>
0
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
22 août 2006 à 15:52
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...
0
cs_bultez
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
22 août 2006 à 16:00
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
0
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
22 août 2006 à 16:02
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 !
0
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
22 août 2006 à 16:05
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
0
cs_bultez
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
22 août 2006 à 16:09
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.
0
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
22 août 2006 à 17:04
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... ^^

à+
0
cs_bultez
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
32
23 août 2006 à 10:04
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
0
Evangun
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
27 août 2006 à 16:21
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 !
0