Sommaire
Empêchez simplement l' action du navigateur par défaut :
window.addEventListener("keydown", function(e) {
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
Réponse originale
J'ai utilisé la fonction suivante dans mon propre jeu:
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 magie opère e.preventDefault();
. Cela bloquera l'action par défaut de l'événement, dans ce cas en déplaçant le point de vue du navigateur.
Si vous n'avez pas besoin des états de bouton actuels, vous pouvez simplement supprimer keys
et simplement supprimer l'action par défaut sur les touches fléchées:
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);
Notez que cette approche vous permet également de supprimer le gestionnaire d'événements ultérieurement si vous devez réactiver le défilement des touches fléchées:
window.removeEventListener("keydown", arrow_keys_handler, false);
Références
lC.keys
place dekeys
l'écouteur keyup. Corrigé et testé dans Firefox et Chrome. Notez que tous les changementskeys
sont facultatifs, mais puisque vous construisez un jeu ...keydown
et nonkeyup
.Pour la maintenabilité, j'attacherais le gestionnaire "bloquant" sur l'élément lui-même (dans votre cas, le canevas).
theCanvas.onkeydown = function (e) { if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { e.view.event.preventDefault(); } }
Pourquoi ne pas simplement faire
window.event.preventDefault()
? MDN déclare:Lectures complémentaires:
la source
J'ai essayé différentes façons de bloquer le défilement lorsque vous appuyez sur les touches fléchées, à la fois jQuery et Javascript natif - ils fonctionnent tous très bien dans Firefox, mais ne fonctionnent pas dans les versions récentes de Chrome.
Même la
{passive: false}
propriété explicite pourwindow.addEventListener
, qui est recommandée comme seule solution de travail, par exemple ici .En fin de compte, après de nombreux essais, j'ai trouvé un moyen qui fonctionne pour moi à la fois dans Firefox et 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 });
Devis
EventTarget.addEventListener()
de MDNla source