javascript - keypressed - onkeypress enter
Detectando comando+pulsación de tecla en Safari (3)
Estoy tratando de interceptar el comando + pulsación de tecla en Safari. He agregado un controlador de eventos de la siguiente manera:
document.onkeypress = handleKeyPress;
function handleKeyPress(event) {
if ("+" === String.fromCharCode(event.charCode) && event.metaKey) {
// my code here
return false;
}
return true;
}
Cuando presiono el comando shift = ( shift = es +
en mi teclado de EE. UU.), La instrucción if no devuelve verdadero.
Si elimino la porción event.metaKey de la instrucción if y presiono shift = , la instrucción if devuelve verdadero.
Además, si cambio la cadena coincidente de "+" a "=" y presiono command = (con o sin la tecla shift), la instrucción if devuelve verdadero.
¿Hay alguna manera de detectar realmente el comando + presionar tecla (sin asumir que la tecla + es shift = y verificar el evento.shiftKey, ya que esto no será cierto para algunos teclados no estadounidenses)?
En primer lugar, no puedo recomendar necesariamente el uso de ⌘ + como atajo, ya que ya significa algo en Safari (es decir, ampliar la página). Alguien podría querer que todavía funcione normalmente. Dependiendo de lo que esté creando, podría tener sentido, pero no anule los accesos directos predeterminados a menos que esté seguro.
De todos modos: los eventos clave son complicados , a menudo porque keyCode / charCode / which properties no siempre coinciden con la letra correcta, por lo que String.fromCharCode
no siempre obtendrá una cadena adecuada. keyIdentifier
veces es algo mejor que observar, pero no siempre (por ejemplo, sus códigos para las letras son siempre mayúsculas).
Lo que hice en el pasado (y no estoy seguro de que esta sea la mejor manera de hacerlo, pero funciona bien), es escuchar los eventos de keydown y keyup y "modificar" las teclas modificadoras. Es decir, siempre que se presione una tecla, compruebe si se trata de una tecla modificadora (es decir, si es cmd, ctrl, alt o shift). Si es así, agrégalo a la "pila" de modificadores. Haz lo opuesto en keyup; si la clave liberada fue un modificador, elimínelo de la pila.
Ahora, de vuelta en el manejador de teclas, si la tecla no era una tecla modificadora, puede enviar el evento de pulsación (que, a diferencia de un evento de pulsación de teclas, tendrá una propiedad keyIdentifier
bastante confiable para verificar), y la pila de modificadores junto con a alguna otra devolución de llamada, eso lo llevará desde allí.
En su caso, dicha devolución de llamada verificaría que la clave cmd esté en la pila, y que keyIdentifier para el evento keydown sea "U + 002B" (que es el código Unicode para +
).
He reunido un ejemplo jsfiddle de lo que estoy hablando. Si hace clic en el panel "Resultado" (para asegurarse de que tiene foco), y presiona ⌘ +, debería mostrar el combo de teclas que utilizó y escribir "¡Correcto!" abajo. De lo contrario, solo mostrará la combinación de teclas. En mi teclado, el signo más es directamente accesible, por lo que la combinación de teclas que veo es solo "⌘ +". Pero si necesita cambiar para escribir un signo más, debería ver "⇧⌘ +".
Es un código generalizado que es bueno para manejar atajos de teclado en Safari / Mac, por lo que puedes construirlo si quieres. Querrá agregar algunos oyentes de eventos para restablecer la pila de modificadores en eventos de desenfoque y demás. Idealmente, la pila modificadora se reiniciaría automáticamente, a medida que suelte las teclas, pero dado que algo podría hacer que el navegador, o el elemento / ventana / documento observado, pierda el foco, los eventos de teclado no se manejarán, y las claves liberadas ganaron no se eliminará de la pila. Así que compruebe si hay eventos borrosos.
Registre el objeto de evento en un nivel de objeto de ventana uno, event = window.EE por ejemplo, luego navegue con Firebug o las Herramientas de desarrollo web de Safari y vea los valores que se activan cuando lo desee. Entonces sabrá contra qué comparar.
Tristemente, no creo que haya una respuesta. El problema es que para CMD+SHIFT+=
el charCode
está presionando es 61 ( =
), no 43 ( +
). Esto parece ser un diseño de todo el sistema, en el que Mac OS X interpreta CMD+SHIFT+=
as =
más dos modificadores, no +
y COMMAND
.
Arreglé un jsFiddle simple para mostrar esto: http://jsfiddle.net/ScuDj/1/
Básicamente, tendrá que lidiar con diseños de teclado si desea detectar COMMAND +
.
Alternativamente, solo podría admitir el teclado numérico +
- ¡que funciona de manera consistente! (es una broma ;-)
(También: intenté adjuntarme al evento textInput
, pero no pude conseguir que se registrara globalmente. Creo que solo funciona en domNodes. Realmente no he usado ese evento mucho).