Резюме
Просто запретите действие браузера по умолчанию :
window.addEventListener("keydown", function(e) {
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
Оригинальный ответ
В своей игре я использовал следующую функцию:
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);
Волшебство происходит внутри e.preventDefault();
. Это заблокирует действие по умолчанию для события, в данном случае перемещение точки обзора браузера.
Если вам не нужны текущие состояния кнопок, вы можете просто отбросить keys
и просто отказаться от действия по умолчанию для клавиш со стрелками:
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);
Обратите внимание, что этот подход также позволяет вам удалить обработчик событий позже, если вам нужно повторно включить прокрутку клавиш со стрелками:
window.removeEventListener("keydown", arrow_keys_handler, false);
Ссылки
lC.keys
вместоkeys
прослушивателя клавиш. Исправлено и протестировано в Firefox и Chrome. Обратите внимание, что все изменения вkeys
являются необязательными, но поскольку вы создаете игру ...keydown
а неkeyup
.Для удобства обслуживания я бы прикрепил обработчик «блокировки» к самому элементу (в вашем случае - холсту).
theCanvas.onkeydown = function (e) { if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { e.view.event.preventDefault(); } }
Почему бы просто не сделать
window.event.preventDefault()
? MDN заявляет:Дальнейшие чтения:
источник
Я пробовал разные способы блокировки прокрутки при нажатии клавиш со стрелками, как jQuery, так и собственный Javascript - все они отлично работают в Firefox, но не работают в последних версиях Chrome.
Даже явное
{passive: false}
свойство forwindow.addEventListener
, которое рекомендуется как единственное рабочее решение, например здесь .В конце концов, после многих попыток я нашел способ, который работает для меня как в Firefox, так и в 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 });
Цитата для
EventTarget.addEventListener()
от MDNисточник