Resumo
Simplesmente evite a ação padrão do navegador:
window.addEventListener("keydown", function(e) {
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
Resposta original
Usei a seguinte função no meu próprio jogo:
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);
A mágica acontece em e.preventDefault();
. Isso bloqueará a ação padrão do evento, neste caso movendo o ponto de vista do navegador.
Se você não precisa dos estados atuais do botão, pode simplesmente soltar keys
e simplesmente descartar a ação padrão nas teclas de seta:
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);
Observe que essa abordagem também permite que você remova o manipulador de eventos posteriormente, se for necessário reativar a rolagem da tecla de seta:
window.removeEventListener("keydown", arrow_keys_handler, false);
Referências
lC.keys
vez dekeys
no ouvinte keyup. Corrigido isso e testado no Firefox e Chrome. Observe que todas as alterações emkeys
são opcionais, mas como você está criando um jogo ...keydown
e nãokeyup
.Para facilidade de manutenção, eu anexaria o manipulador de "bloqueio" ao próprio elemento (no seu caso, a tela).
theCanvas.onkeydown = function (e) { if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { e.view.event.preventDefault(); } }
Por que não simplesmente fazer
window.event.preventDefault()
? Estados MDN :Leituras adicionais:
fonte
Eu tentei diferentes maneiras de bloquear a rolagem quando as teclas de seta são pressionadas, tanto jQuery quanto Javascript nativo - todos funcionam bem no Firefox, mas não funcionam nas versões recentes do Chrome.
Mesmo a
{passive: false}
propriedade explícita parawindow.addEventListener
, que é recomendada como a única solução de trabalho, por exemplo aqui .No final, depois de muitas tentativas, descobri uma maneira que funciona para mim tanto no Firefox quanto no 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 });
Cotação para
EventTarget.addEventListener()
de MDNfonte