jQueryのキー操作周りのイベントについて少し調べてみました。
キーイベントについて
keydown、keyup、keypressの3種類があります。
keydown | キーボードのキーが押し込まれたときのイベント。 |
---|---|
keyup | 押し込まれたキーボードのキーが上がったときのイベント。 |
keypress | キーボードのキーが押されたときのイベント。 |
keypressはブラウザによって挙動が違う場合があるらしいので、特にkeypressでないとだめという場合でなければ、keydownかkeyupを使うのが無難そうです。
ちなみに処理の実行される順番はkeydown→keypress→keyupのようです。
HTML
<textarea id="sample01"></textarea>
JavaScript
$(function() { $(document).on('keydown', '#sample01', function(e) { console.log('===== keydown ====='); // 1番目に実行される console.log(e); console.log(e.keyCode); }); $(document).on('keyup', '#sample01', function(e) { console.log('===== keyup ====='); // 3番目に実行される console.log(e); console.log(e.keyCode); }); $(document).on('keypress', '#sample01', function(e) { console.log('===== keypress ====='); // 2番目に実行される console.log(e); console.log(e.keyCode); console.log(e.which); }); });
jQueryのキーイベントのデモページ
各イベント時に取得できるkeyCodeはキーコード一覧を参考にしました。
CtrlやShift、Altと何かキーを同時に押す場合
CtrlやShift、Altと何かキーを同時に押す場合は、専用のイベントがあるようです。
HTML
<textarea id="sample02">カット、コピー、ペーストのイベントを取得してみます。</textarea>
JavaScript
$(function() { $(document).on('keydown', '#sample02', function(e) { if(e.ctrlKey) { if(e.keyCode === 88) { console.log('カットしました'); } if(e.keyCode === 67) { console.log('コピーしました'); } if(e.keyCode === 86) { console.log('ペーストしました'); } } if(e.shiftKey) { console.log('Shiftを押しています'); } if(e.altKey) { console.log('Altを押しています'); } }); });
CtrlやShift、Altと何かキーを同時に押す場合のデモページ
特定のキーの入力を効かないようにする場合
HTML
<textarea id="sample03">バックスペースキーが効かないようにしています。</textarea>
JavaScript
$(function() { $(document).on('keydown', '#sample03', function(e) { if(e.keyCode === 8) { return false; } }); });
複数のボタンを押した時に何らかの処理をする場合
CtrlやShift、Altではない特定のキーを複数押した時に、処理を行ってみます。
HTML
<textarea id="sample04">aを押しながら他のキーを押すとコンソールがでます。</textarea>
JavaScript
$(function() { var flag = false; $(document).on('keydown', '#sample04', function(e) { if(e.keyCode === 65) { flag = true; } else if(flag == true) { console.log('aを押しながら他のキーを押しました'); } }); $(document).on('keyup', '#sample04', function(e) { if(e.keyCode === 65) { flag = false; } }); });
矢印キーを使って移動処理を行ってみる
矢印キーを押した時に、要素が移動するサンプルです。
(厳密には要素が移動しているのではなく、class名を移動させています。)
HTML
<div id="sample05"></div>
CSS
#sample05 { width: 900px; height: 900px; overflow: hidden; margin: 0 auto; border: #333 1px solid; } #sample05 .squares { float: left; width: 10%; height: 10%; } #sample05 .current { background: #E74C3C; }
JavaScript
var maxW = 10; var maxH = 10; var currentW = 5; var currentH = 5; $(function() { var insert = ''; for (var i = 0; i < 100; i++) { insert += '<div class="squares"></div>'; }; $('#sample05').append(insert); $('#sample05 .squares').eq(currentSquares()).addClass('current'); $(window).on('keydown', function(e) { if(e.keyCode === 37) { // ← if(currentW > 0) { currentW -= 1; currentSquares(); return false; } } if(e.keyCode === 38) { // ↑ if(currentH > 0) { currentH -= 1; currentSquares(); return false; } } if(e.keyCode === 39) { // → if(currentW < maxW - 1) { currentW += 1; currentSquares(); return false; } } if(e.keyCode === 40) { // ↓ if(currentH < maxH - 1) { currentH += 1; currentSquares(); return false; } } }); }); function currentSquares() { $('#sample05 .squares').removeClass('current').eq((currentH * maxW) + currentW).addClass('current'); }
【参考サイト】
- keydown(fn) – jQuery 日本語リファレンス
- keypress(fn) – jQuery 日本語リファレンス
- jQueryを使ってキーの同時押し取得(shiftやctrl) – Qiita
- キーコード一覧
- jQueryでファンクションキーやバックスペースキーを無効化する制御
コメントが承認されるまで時間がかかります。