11550 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'aimerais savoir s'il est possible en javascript de récupéré l'identifiant d'un élément survolé par la souris ou sur lequel "se trouve" le focus lors d'une navigation au clavier.

Ex : j'ai une div qui a pour propriété id="toto". Lorsque ma souris survole la zone de cet élément, j'aimerais pouvoir récupéré la valeur de l'id (cad "toto").

Merci.
Modifié par Polack (15 Feb 2006 - 17:30)
Bonsoir,

Je pense que tu peux t'en sortir avec ceci, pour autant que tu utilises bien ce modèle d'évènement-ci, sans passer par le code HTML, ni par les fonctions attachEvent/addEventListener (pour ces dernières, c'est à cause de la bête noire habituelle que c'est impossible).


document.getElementById('madiv').onmouseover = function () {
alert("Vous survolez l'élément " + this.id);
}
Euh ouais... je ne suis pas sûr de bien comprendre ni que cela me permette de faire ce que je cherche.

Quelques explications...
Je cherche à faire un menu déroulant horizontal comme celui qui est présenté dans le tutorial Un menu déroulant en CSS et XHTML (horizontal et vertical). Mon menu (encore à l'état de prototype) a la la structure suivante :
<div id="menu">
    <dl>
        <dt><a href="#" title="Retour à l'accueil" onmouseover="cacheAllMenus();" onfocus="cacheAllMenus();">Accueil</a></dt>
    </dl>
    <dl>
        <dt onmouseover="afficheMenu('secMenu1');">
           <a href="#" title="Menu 1" onfocus="afficheMenu('secMenu1');">Menu 1</a>
        </dt>
        <dd id="secMenu1" onmouseover="afficheMenu('secMenu1');" onmouseout="cacheAllMenus();">
            <ul>
                <li><a href="#" onfocus="afficheMenu('secMenu1');">Sous-Menu 1.1</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu1');">Sous-Menu 1.2</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu1');">Sous-Menu 1.3</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu1');">Sous-Menu 1.4</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu1');">Sous-Menu 1.5</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu1');">Sous-Menu 1.6</a></li>
            </ul>
        </dd>
    </dl>
    <dl>
        <dt onmouseover="afficheMenu('secMenu2');">
            <a href="#" title="Menu 2" onfocus="afficheMenu('secMenu2');">Menu 2</a>
        </dt>
        <dd id="secMenu2" onmouseover="afficheMenu('secMenu2');" onmouseout="cacheAllMenus();">
            <ul>
                <li><a href="#" onfocus="afficheMenu('secMenu2');">Sous-Menu 2.1</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu2');">Sous-Menu 2.2</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu2');">Sous-Menu 2.3</a></li>
            </ul>
        </dd>
    </dl>
    <dl>
        <dt onmouseover="afficheMenu('secMenu3');">
            <a href="#" title="Menu 3" onfocus="afficheMenu('secMenu3');">Menu 3</a>
        </dt>
        <dd id="secMenu3" onmouseover="afficheMenu('secMenu3');" onmouseout="cacheAllMenus();">
            <ul>
                <li><a href="#" onfocus="afficheMenu('secMenu3');">Sous-Menu 3.1</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu3');">Sous-Menu 3.2</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu3');">Sous-Menu 3.3</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu3');">Sous-Menu 3.4</a></li>
                <li><a href="#" onfocus="afficheMenu('secMenu3');">Sous-Menu 3.5</a></li>
            </ul>
        </dd>
    </dl>
</div>

Et mon javascript :
// Affiche le menu d'ID "idMenu"
function afficheMenu(idMenu) {
    // On cache tous les menus
    cacheAllMenus(idMenu);
    // On affiche le menu
    var leMenu = document.getElementById(idMenu);
    if (leMenu) {
        leMenu.style.display = 'block';
    }
}

// Cache le menu d'ID "idMenu"
function cacheMenu(idMenu) {
    var leMenu = document.getElementById(idMenu);
    if (leMenu) {
        leMenu.style.display = 'none';
    }
}

// Cache tous les menus à l'exception du menu d'ID "idMenu"
function cacheAllMenus(idMenu) {
   for (i = 1; i <= 10; i++) {
       var idTmp = 'secMenu'+i;
       if (document.getElementById(idTmp) && (idMenu != idTmp)) {
           cacheMenu(idTmp);
       }
   } // for i
}

Mon problème est le suivant : si les sous-menus s'affichent sans problème, il arrive par contre qu'ils restent affichés alors que je ne le souhaite pas (ex: on survole "Menu 1", puis on déplace la souris en dehors du menu sans survoler le sous-menu affiché).

J'ai eu plusieurs idées pour corriger le problème :
1° Ajouter un onmouseover faisant appel à ma fonction cacheAllMenus()sur les autres div. Problème : ce n'est pas conforme XHTML et cela ne marche pas sur IE
- Ajouter des onmouseout faisant appel à ma fonction cacheAllMenus(). Cela marche bien sous Firefox, mais c'est une catastrophe sous IE (lorsque je passe de "Menu 1" au sous-menu, ce dernier disparait).

Après réflexion, je me suis dis que la 2e solution pourrait marcher à condition de faire un truc du genre :
- lors du onmouseout, si le nouvel élément survolé est le sous-menu, alors ne rien faire, sinon cacher le sous menu
- faire de même avec le onblur

C'est pour cette raison que je cherche à savoir s'il est possible de récupérer l'identifiant de l'élément survolé ou "focusé".

Maintenant si quelque voit une autre solution, je suis preneur Smiley biggrin
Salut
Je te réponds par un test :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>id souris</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
<script type="text/javascript">
<!--//
gk=window.Event?1:0; // navigateurs Gecko ou IE
D=document;

function ctrl(e)
{
el=gk?e.target:event.srcElement; //objet sous la souris
if(!el.tagName)el=el.parentNode; // noeud #text
defaultStatus=el.id
}

D.onmousemove=ctrl
//-->
</script>
</head>
<body>

<div id="pop1" class="pp">
<h1 id="h1">infobulle !</h1>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum in mauris vel ipsum viverra tincidunt. </p>
<p>venenatis et, elementum et, sapien. Donec nonummy. Vestibulum condimentum</p>
<img id="im1" src="http://css.alsacreations.com/xmedia/exemples/popup/image.gif" alt="image d'exemple" />
<p id="ptitext" >regarder la barre de status. </p>
</div>

</body>
</html>

Tu fais fausse route avec ton js en dur. Mieux vaut un js non intrusif qui gère une classe CSS.
J'ai comme toi géré la navigation clavier dans ce test
Modifié par chmel (16 Feb 2006 - 17:08)
Merci pour ta réponse chmel.

J'ai fait un rapide test du code que tu as donné et cela marche bien sur IE, mais pas sur Firefox ni sur Opera (mais là c'est normal, j'ai bas de barre de statut Smiley langue ).
Je vais faire quelques tests avec des alert() pour comprendre un peu mieux comment ça marche et voir comment je peux adapter ça à mes besoins.

a écrit :
Tu fais fausse route avec ton js en dur. Mieux vaut un js non intrusif qui gère une classe CSS.

Je ne suis pas sûr de comprendre. Entends-tu par là qu'il est préférable de modifier un élément en lui applicant une class plutôt que de modifier directement son style?
Si c'est bien ça, je ne vois pas trop ce que cela change. Pourrais-tu être un peu plus explicite svp?
Polack a écrit :
Merci pour ta réponse chmel.

J'ai fait un rapide test du code que tu as donné et cela marche bien sur IE, mais pas sur Firefox ni sur Opera (mais là c'est normal, j'ai bas de barre de statut Smiley langue ).
.

A moins que tu ais désactivé ta barre de status, ça marche sur Netscape6++.
autre test


a écrit :
Tu fais fausse route avec ton js en dur. Mieux vaut un js non intrusif qui gère une classe CSS.

Polack a écrit :
Je ne suis pas sûr de comprendre. Entends-tu par là qu'il est préférable de modifier un élément en lui applicant une class plutôt que de modifier directement son style?
Si c'est bien ça, je ne vois pas trop ce que cela change. Pourrais-tu être un peu plus explicite svp?

Pour une plus grande facilité de modification, je préfère séparer HTML,CSS et JS. Tu peut éditer les pages du site, il n'y a pas de JS dans la page.
Le style est modifié dans la feuille de style et l'utilisation d'une class permet de l'atteindre avec un language serveur Smiley cligne
Modifié par chmel (17 Feb 2006 - 13:51)