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 Membre Dernière intervention 23 décembre 2008 24
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 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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 4
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 4
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 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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 4
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 4
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 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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 4
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 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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 4
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
Rejoignez-nous