87 votes

Comment puis-je donner le focus clavier à un DIV et y attacher des gestionnaires d'événements clavier ?

Je construis une application dans laquelle je veux pouvoir cliquer sur un rectangle représenté par un DIV, puis utiliser le clavier pour déplacer ce DIV en répertoriant les événements clavier.

Plutôt que d'utiliser un récepteur d'événements pour ces événements clavier au niveau du document, puis-je écouter les événements clavier au niveau du DIV, peut-être en lui donnant le focus clavier ?

Voici un exemple simplifié pour illustrer le problème :

<html>
<head>
</head>
<body>

<div id="outer" style="background-color:#eeeeee;padding:10px">
outer

   <div id="inner" style="background-color:#bbbbbb;width:50%;margin:10px;padding:10px;">
   want to be able to focus this element and pick up keypresses
   </div>
</div>

<script language="Javascript">

function onClick()
{
    document.getElementById('inner').innerHTML="clicked";
    document.getElementById('inner').focus();

}

//this handler is never called
function onKeypressDiv()
{
    document.getElementById('inner').innerHTML="keypress on div";
}

function onKeypressDoc()
{
    document.getElementById('inner').innerHTML="keypress on doc";
}

//install event handlers
document.getElementById('inner').addEventListener("click", onClick, false);
document.getElementById('inner').addEventListener("keypress", onKeypressDiv, false);
document.addEventListener("keypress", onKeypressDoc, false);

</script>

</body>
</html>

Lorsque je clique sur le DIV interne, j'essaie de lui donner le focus, mais les événements clavier suivants sont toujours pris au niveau du document, et non au niveau de mon écouteur d'événements de DIV.

Dois-je simplement implémenter une notion de focus clavier spécifique à l'application ?

Je dois ajouter que j'ai seulement besoin que cela fonctionne dans Firefox.

1 votes

Ce n'est pas vraiment un doublon - la question a été posée deux ans auparavant, et il s'agit de savoir comment recevoir des événements clavier sur des éléments arbitraires, plutôt que d'utiliser la fonction focus() función.

176voto

Paul Dixon Points 122033

Trié - J'ai ajouté l'attribut tabindex au DIV cible, ce qui fait qu'il capte les événements clavier, par exemple

<div id="inner" tabindex="0">
    this div can now have focus and receive keyboard events
</div>

Informations glanées auprès de http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-TECHS/SCR29.html

7 votes

De plus, si vous ne voulez pas que la division ait une bordure bleue en pointillés lorsqu'elle est focalisée, vous pouvez la styliser de la manière suivante outline: 0px solid tranparent; . Voir : stackoverflow.com/a/2260788/402807

5 votes

Ou bien tabindex="-1" ce qui l'empêchera également d'obtenir la bordure en pointillés.

0 votes

Je n'arrive pas à le faire fonctionner dans Chrome 60 et FF 54. Et IE11 fait comme par magie ce qu'il faut, même sans l'option tabindex . Cette réponse est-elle dépassée ?

6voto

Peter Bagnall Points 738

La réponse de Paul fonctionne bien, mais vous pourriez aussi utiliser contentEditable, comme ceci...

document.getElementById('inner').contentEditable=true;
document.getElementById('inner').focus();

Cela pourrait être préférable dans certains cas.

6 votes

Si vous faites cela, Chrome 17 place un curseur sur l'élément en focus et vous pouvez taper des choses sur l'élément. Je ne le recommande pas.

1 votes

@Seppo, c'est un bon point. Si vous consommez les événements clavier, vous ne serez pas nécessairement en mesure d'éditer, mais avoir un curseur pourrait être désordonné selon ce que vous essayez de faire. D'ailleurs, ce n'est pas seulement Chrome 17, mais presque tous les navigateurs récents qui se comportent de cette façon - certainement FF et Safari - IE aussi je crois, bien que je n'aie pas testé récemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X