Ringkasan
Cukup cegah tindakan browser default :
window.addEventListener("keydown", function(e) {
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
Jawaban asli
Saya menggunakan fungsi berikut di game saya sendiri:
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);
Keajaiban terjadi di e.preventDefault();
. Ini akan memblokir tindakan default dari acara tersebut, dalam hal ini memindahkan sudut pandang browser.
Jika Anda tidak memerlukan status tombol saat ini, Anda cukup melepas keys
dan membuang tindakan default pada tombol panah:
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);
Perhatikan bahwa pendekatan ini juga memungkinkan Anda untuk menghapus pengendali kejadian nanti jika Anda perlu mengaktifkan kembali pengguliran tombol panah:
window.removeEventListener("keydown", arrow_keys_handler, false);
Referensi
lC.keys
bukankeys
di pendengar keyup. Memperbaiki ini dan mengujinya di Firefox dan Chrome. Perhatikan bahwa semua perubahankeys
adalah opsional, tetapi karena Anda sedang membuat game ...keydown
dan tidakkeyup
.Untuk pemeliharaan, saya akan memasang penangan "pemblokiran" pada elemen itu sendiri (dalam kasus Anda, kanvas).
theCanvas.onkeydown = function (e) { if (e.key === 'ArrowUp' || e.key === 'ArrowDown') { e.view.event.preventDefault(); } }
Mengapa tidak melakukannya
window.event.preventDefault()
? MDN menyatakan:Bacaan lebih lanjut:
sumber
Saya telah mencoba berbagai cara untuk memblokir pengguliran saat tombol panah ditekan, baik jQuery maupun Javascript asli - semuanya berfungsi dengan baik di Firefox, tetapi tidak berfungsi di versi terbaru Chrome.
Bahkan
{passive: false}
properti eksplisit untukwindow.addEventListener
, yang direkomendasikan sebagai satu-satunya solusi yang berfungsi, misalnya di sini .Pada akhirnya, setelah banyak mencoba, saya menemukan cara yang berhasil untuk saya di Firefox dan 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 });
Kutipan untuk
EventTarget.addEventListener()
dari MDNsumber