Estoy creando una aplicación en la que quiero poder hacer clic en un rectángulo representado por un DIV y luego usar el teclado para mover ese DIV enumerando los eventos del teclado.
En lugar de usar un detector de eventos para esos eventos de teclado en el nivel de documento, ¿puedo escuchar los eventos de teclado en el nivel DIV, quizás dándole el foco de teclado?
Aquí hay una muestra simplificada para ilustrar el problema:
<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>
Al hacer clic en el DIV interno, trato de enfocarlo, pero los eventos de teclado posteriores siempre se recogen en el nivel del documento, no en mi oyente de eventos de nivel DIV.
¿Simplemente necesito implementar una noción de enfoque de teclado específica de la aplicación?
Debo agregar que solo necesito esto para funcionar en Firefox.
fuente
focus()
función.Respuestas:
Ordenado: agregué el atributo tabindex al DIV de destino, lo que hace que recoja eventos de teclado, por ejemplo
<div id="inner" tabindex="0"> this div can now have focus and receive keyboard events </div>
Información obtenida de http://www.w3.org/WAI/GL/WCAG20/WD-WCAG20-TECHS/SCR29.html
fuente
outline: 0px solid tranparent;
. Ver: stackoverflow.com/a/2260788/402807tabindex="-1"
, eso también evitará que obtenga el borde punteado.tabindex
. ¿Esta respuesta está desactualizada?outline
no es accesible. si no le gusta cómo se ve, le recomiendo dar alguna otra indicación visual de que el elemento está enfocado antes de deshacerse deloutline
La respuesta de Paul funciona bien, pero también puedes usar contentEditable, así ...
document.getElementById('inner').contentEditable=true; document.getElementById('inner').focus();
Podría ser preferible en algunos casos.
fuente