11548 sujets

JavaScript, DOM et API Web HTML5

Dans mon exemple précédent, je cherchais à récupérer la valeur "name" d'un tag <dd>. J'ai trouvé le moyen grâce à getAttribute :
nom_dd = obj_jojo.getAttribute('name');
alert(nom_dd);

La "boîte" alert renvoie bien le name de mon <dd>.

J'aimerai maintenant me servir de la variable ainsi définis (nom_dd) pour appeler un <dt> du même nom. Je pensais que ce morceau de code fonctionnerai :
DD = document.getElementsByName(nom_dd);

Mais le DD.lenght est égal à 0.

J'imagine qu'il y a un "truc" que je fais mal... mais quoi...

GS.
Modifié le 06 Dec 2004 - 08:02
Votre code n'est pas correct car il n'y a pas d'attribut html 'name' pour les balises <dd> et <dt> dans les DTD html ou xhtml.
L'attribut name est non valide selon la DTD xhtml (strict, trans aussi je crois mais je suis pas sûr) sauf pour les formulaires. Il faut remplacer par ID partout ailleurs.

"Ehh les mecs" pourquoi vous vous tutoyer pas ?? enfin c'est vous qui voyez messieurs Smiley cligne
Je comprends : c'est un problème de "conformité"... Rien à voir avec ce qui est possible ou non.

Mais mon intention est bien de produire quelque chose de conforme. L'ennui c'est que pour des raisons SPIP, je ne peux pas passer par l'ID. Le class ? Pourquoi pas. Mais existe-t-il quelque chose comme getElementsByClass ?

GS.
Modifié le 05 Dec 2004 - 19:36
getElementsByClass ou ClassName je sais plus ...

Mais en tout cas, ça renvoi un tableau (array) repertoriant les différents éléments ayant pour class la class demandée
gsaunier a écrit :
Ah...

Pourtant je m'en sers depuis ce matin avec de bons résultats. Pouvez-vous préciser votre commentaire ?

GS.


Oui car, à priori, la plupart des navigateurs implémentant getAttribute() se contentent de renvoyer le contenu de l'attribut donné s'il existe, même si celui-ci n'est pas valide au regard de la DTD ou du schéma XML du document. Mais comme ce comportement ne devrait pas être considéré comme allant de soi, il vaut mieux ne pas tenter le diable Smiley cligne

Il n'y a pas non plus de méthode générique getElementsByClass(), mais il doit être possible d'en implémenter une:


function getElementsByClass(className, startNode)
{
    var tagFilter  = ( arguments.length > 2 ) ? arguments[2].toLowerCase() : '';
    var nodeList   = startNode.childNodes;
    var tmpArray   = [];
    var checkClass = new RegExp("(^| )" + className + "( |$)");
    
    for( var i = 0, m = nodeList.length; i < m; i++ )
    {
        if( nodeList[i].nodeType != 1 )/* 1 = Node.ELEMENT_NODE */
        {
            continue;
        }
        
        if( nodeList[i].childNodes.length > 0 )
        {
            tmpArray = tmpArray.concat(getElementsByClass(className, nodeList[i], tagFilter));
        }
        
        if( checkClass.test(nodeList[i].className) && ( tagFilter == '' || tagFilter == nodeList[i].nodeName.toLowerCase() ) )
        {
            tmpArray[tmpArray.length] = nodeList[i];
        }
    }
    
    return tmpArray;
}

/*
exemple:

var tmp = getElementsByClass('maclasse', document.body);
ou encore:
var tmp = getElementsByClass('maclasse', document.body, 'dd');// pour limiter la recherche aux balises <dd>
*/
[/i][/i][/i][/i][/i][/i]
Arf heureusement que tu es là Bobe, en effet il n'y a pas de fonction prédéfinie récupérant telle ou telle class, je voulais justement l'utiliser une fois et j'avais vu qu'il fallait la construire Smiley confused

Par conte, il y a possibilité de tester la class avec className
genre :

document.getElementsByTagName('div')[0].className


Peut être que ça peut suffire ici ...
Et bien ! Je n'en demandais pas autant (quoi que).

Du coup, je tente une dernière petite question : est-il possible, simplement, de savoir quel élément une souris survole lorsqu'elle "sort" d'un autre élément ? Dit autrement : lorsqu'un onmouseOut est lancé, y a-t-il un moyen de faire savoir à une fonction appelée l'élément qui est survolé en sortie ?

Ce serait pas mal...

GS.
Oui, c'est possible. C'est prévu dans le DOM2 Events.

Sur l'évènement 'mouseover', la propriété target de l'objet d'évènement fait référence à l'élément sur lequel on arrive et relatedTarget fait référence à l'élément duquel on vient.
Sur l'évènement 'mouseout', la propriété target fait référence à l'élément que l'on quitte et relatedTarget fait référence à l'élément sur lequel on arrive.

http://www.yoyodesign.org/doc/w3c/dom2/events/Overview.html
http://www.brainjar.com/dhtml/events/default.asp
http://www.quirksmode.org/dom/w3c_events.html

P.S: Voir sur les deux derniers liens pour les correspondances entre l'API du W3C et celle de Microsoft si nécessaire.

edit: Le morceau de code que j'ai donné dans mon message précédent a été un peu malmené par le parseur du forum. Il faut ajouter [ i ] derrière tous les 'nodeList' dans la boucle Smiley cligne
Modifié le 05 Dec 2004 - 23:15
Magnifique ! C'est exactement ce que je cherchais. L'idée, tu l'as sans doute compris, est d'empêcher l'effet de clignotement en introduisant un "si" dans le 'over et le 'out. Ainsi, si la souris vient d'un bloc où il fallait afficher le sous-menu, alors on empêchera le changement du display.

Je regarde donc tout cela...

Merci encore.

GS.