[解決済み] ユーザーブラウザの矢印キーによるスクロールを無効にする
2023-02-02 14:57:07
質問
キャンバスとjavascriptを使ってゲームを作っています。
画面より長いページ(コメントなど)の場合、下矢印を押すとページが下にスクロールしてしまい、ゲームができなくなります。
プレイヤーが下に移動したいだけのときに、ウィンドウがスクロールしないようにするにはどうしたらよいでしょうか。
Javaゲームなどでは、ユーザーがクリックする限りは問題ないのでしょうが。
からの解決策を試しました。 FFで矢印キーによるページスクロールを無効にする方法 を試してみましたが、うまくいきませんでした。
どうすれば解決するのでしょうか?
概要
単純に は、デフォルトの ブラウザのアクションを阻止します。
window.addEventListener("keydown", function(e) {
if(["Space","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].indexOf(e.code) > -1) {
e.preventDefault();
}
}, false);
Internet Explorer などの古いブラウザに対応する必要がある場合は
e.keyCode
の代わりに
e.code
の代わりに
keyCode
は非推奨です
であり、文字列ではなく実際のコードを使用する必要があります。
// Deprecated code!
window.addEventListener("keydown", function(e) {
// space and arrow keys
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
オリジナルの回答
自作ゲームに以下のような関数を使用しました。
var keys = {};
window.addEventListener("keydown",
function(e){
keys[e.code] = true;
switch(e.code){
case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight":
case "Space": e.preventDefault(); break;
default: break; // do not block other keys
}
},
false);
window.addEventListener('keyup',
function(e){
keys[e.code] = false;
},
false);
マジックは
e.preventDefault();
. これは、イベントのデフォルトのアクション、この場合はブラウザの視点を移動させることをブロックします。
現在のボタンの状態が不要であれば、単に
keys
を削除し、矢印キーのデフォルトアクションを破棄するだけです。
var arrow_keys_handler = function(e) {
switch(e.code){
case "ArrowUp": case "ArrowDown": case "ArrowLeft": case "ArrowRight":
case "Space": e.preventDefault(); break;
default: break; // do not block other keys
}
};
window.addEventListener("keydown", arrow_keys_handler, false);
この方法は、後で矢印キーのスクロールを再び有効にする必要がある場合に、イベントハンドラを削除することも可能であることに注意してください。
window.removeEventListener("keydown", arrow_keys_handler, false);
参考文献
-
MDN。
window.addEventListener
-
MDN
window.removeEventListener
-
MDN
KeyboardEvent.code
インターフェース
関連
-
[解決済み] JavaScriptのオブジェクトにキーが存在するかどうかをチェックする?
-
[解決済み] jQueryで入力を無効化/有効化する?
-
[解決済み] 画面サイズ、現在のウェブページ、ブラウザウィンドウのサイズを取得する
-
[解決済み] Chromeの同一生成元ポリシーを無効にする
-
[解決済み] Facebookがブラウザに統合されたDeveloper Toolsを無効にする方法を教えてください。
-
[解決済み] スクロールした後に要素が表示されているかどうかを確認するには?
-
[解決済み] HTML5/Canvas/JavaScriptを使用してブラウザ内のスクリーンショットを撮影する
-
[解決済み】スクロールを一時的に無効にする方法は?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクロールを一時的に無効にする方法は?
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法