Resumen
Simplemente evite la acción predeterminada del navegador:
window.addEventListener("keydown", function(e) {
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
Respuesta original
Usé la siguiente función en mi propio juego:
var keys = {};
window.addEventListener("keydown",
function(e){
keys[e.keyCode] = true;
switch(e.keyCode){
case 37: case 39: case 38: case 40:
case 32: e.preventDefault(); break;
default: break;
}
},
false);
window.addEventListener('keyup',
function(e){
keys[e.keyCode] = false;
},
false);
La magia ocurre en e.preventDefault();
. Esto bloqueará la acción predeterminada del evento, en este caso mover el punto de vista del navegador.
Si no necesita los estados del botón actual, simplemente puede soltar keys
y descartar la acción predeterminada en las teclas de flecha:
var arrow_keys_handler = function(e) {
switch(e.keyCode){
case 37: case 39: case 38: case 40:
case 32: e.preventDefault(); break;
default: break;
}
};
window.addEventListener("keydown", arrow_keys_handler, false);
Tenga en cuenta que este enfoque también le permite eliminar el controlador de eventos más adelante si necesita volver a habilitar el desplazamiento de la tecla de flecha:
window.removeEventListener("keydown", arrow_keys_handler, false);
Referencias
lC.keys
lugar dekeys
en el oyente de teclado. Se corrigió esto y se probó en Firefox y Chrome. Tenga en cuenta que todos los cambioskeys
son opcionales, pero como está creando un juego ...keydown
y nokeyup
.Para facilitar el mantenimiento, adjuntaría el controlador de "bloqueo" en el elemento en sí (en su caso, el lienzo).
theCanvas.onkeydown = function (e) { if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { e.view.event.preventDefault(); } }
¿Por qué no hacerlo simplemente
window.event.preventDefault()
? MDN dice:Lecturas adicionales:
fuente
Probé diferentes formas de bloquear el desplazamiento cuando se presionan las teclas de flecha, tanto jQuery como Javascript nativo; todas funcionan bien en Firefox, pero no funcionan en versiones recientes de Chrome.
Incluso la
{passive: false}
propiedad explícita parawindow.addEventListener
, que se recomienda como la única solución de trabajo, por ejemplo aquí .Al final, después de muchos intentos, encontré una forma que funciona para mí tanto en Firefox como en Chrome:
window.addEventListener('keydown', (e) => { if (e.target.localName != 'input') { // if you need to filter <input> elements switch (e.keyCode) { case 37: // left case 39: // right e.preventDefault(); break; case 38: // up case 40: // down e.preventDefault(); break; default: break; } } }, { capture: true, // this disables arrow key scrolling in modern Chrome passive: false // this is optional, my code works without it });
Cotización
EventTarget.addEventListener()
de MDNfuente