2010-09-09 11 views
35

Me gustaría agregar soporte para atajos de teclado a un par de páginas en mi aplicación web interceptando el manejador de eventos de pulsación de tecla del objeto de documento, no el atributo de clave de acceso.Sobrescribir los accesos directos de teclado del navegador

El problema es que cada navegador tiene sus propias combinaciones de teclado, por lo que es imposible crear un conjunto de combinaciones de teclado que funcionen en todos los navegadores web y sean consistentes (por ejemplo, sería absurdo guardar el atajo). fue Ctrl + Shift + S mientras que uno de borrado era Alt + D.)

por lo que pensé que sería apenas más simples para anular los atajos del navegador por completo en un par de páginas con la mina .

Todas las desventajas a un lado, ¿es posible? Si es así, como lo haces?

+2

En una nota personal, por favor, evitar anulando los habituales del navegador que sean consistentes entre los navegadores tales como 'Cw',' Ct', 'CSt' ... Algunos de los productos de Google anulan los habituales del navegador y su increíblemente molesto ! –

+1

Puede ser difícil saber cuáles son los accesos directos de usuario "comunes". Por ejemplo, ¿muchos usuarios usan 'C-e' o es relativamente correcto anular? Sería genial tener un gráfico de porcentajes de usuarios que usan cada atajo del navegador. – JKillian

Respuesta

12

Hay una excelente cobertura de esta aquí: http://unixpapa.com/js/key.html

En cuanto a si esto es algo que se debe hacer, un buen número de teclas pregunta editor de anulación de stackoverflow sin perturbar demasiado (Pase el ratón sobre los botones de la barra) .

+3

Necesita manejar el evento * keydown * con 'e.preventDefault(); e.stopPropagation(); '. Mientras maneja la tecla de selección, una cosa para recordar es que puede ocurrir varias veces si el usuario mantiene pulsada la tecla durante un poco más de tiempo. – ShitalShah

+7

Debe responder la pregunta directamente en Desbordamiento de pila, no vincular a otro lugar (los enlaces externos pueden romperse o cambiar o no responder directamente la pregunta). Ver [¿Las respuestas que solo contienen enlaces en otros lugares realmente son "buenas respuestas"?] (Http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – mgiuca

+0

Realmente odio la forma en que Ctrl-L se roba cuando uso el editor de preguntas de StackOverflow. Hace más difícil realizar búsquedas en la web al editar preguntas. –

29
onkeydown = function(e){ 
    if(e.ctrlKey && e.keyCode == 'S'.charCodeAt(0)){ 
    e.preventDefault(); 
    //your saving code 
    } 
} 
+5

En muchas situaciones, no creo que eso funcione. Con teclas como 'tab', muchos navegadores interceptarán el comando antes de que el script pueda alterar el comportamiento de la clave correctamente. – Trafalmadorian

+4

'event.preventDefault' solo funciona (cuando lo hace) en navegadores compatibles con W3C, no (digamos) el navegador dominante en la web general, Microsoft, a menos que, por supuesto, esté usando una biblioteca como jQuery que la agregue para ti. –

+3

T.J.> ¿Quiere decir que jQuery puede anular los atajos de teclado incluso en IE? –

8

Aquí es mi solución a este problema:

La mayoría (si no todos) de los atajos del navegador será anulado. Solo los del sistema, como Alt + Pestaña o La tecla Windows no lo hará.

document.onkeydown = overrideKeyboardEvent; 
document.onkeyup = overrideKeyboardEvent; 
var keyIsDown = {}; 

function overrideKeyboardEvent(e){ 
    switch(e.type){ 
    case "keydown": 
     if(!keyIsDown[e.keyCode]){ 
     keyIsDown[e.keyCode] = true; 
     // do key down stuff here 
     } 
    break; 
    case "keyup": 
     delete(keyIsDown[e.keyCode]); 
     // do key up stuff here 
    break; 
    } 
    disabledEventPropagation(e); 
    e.preventDefault(); 
    return false; 
} 
function disabledEventPropagation(e){ 
    if(e){ 
    if(e.stopPropagation){ 
     e.stopPropagation(); 
    } else if(window.event){ 
     window.event.cancelBubble = true; 
    } 
    } 
} 
+4

Esto no detiene a ALT + E al abrir el menú Editar del navegador. –

Cuestiones relacionadas