• ベストアンサー

Altキー+○キーでのショートカットの制御

お世話になります。 papillon68と申します。 Windows 2000、XP IE6以降限定 ブラウザでAlt+○キーを押すことで様々な操作をキーボードのみで 行うことができます。 (参考:http://www.clubqa.com/weekly/qa020403.htm) 今回行いたいことはこのキーボードのみでの操作の 一部を制限したいというものです。 例えば、 ・Altキー+←キーで一つ履歴が戻ります。[history.back(-1)] ・Altキー+→キーで一つ履歴が進みます。[history.back(1)] これを制限するために ----------------------------------------- // Altキー+←キーの制限 if((event.altKey) && (event.keyCode==37)) { // チェック用 //alert('通った'); event.keyCode = 0; return false; } ----------------------------------------- としていますが、一つ前の画面に戻ってしまいます。 alert()を使って実際にif内を通っているかを チェックしてみると通っていないようです。 同じようにCtrlの場合だと同じ方法で制限することができました。 ----------------------------------------------- // 更新の制限(Ctrl+R) if((event.ctrlKey) && (event.keyCode==82)) { // チェック用 // alert('通った'); event.keyCode = 0; false; } ----------------------------------------------- こちらはアラートが表示され、ページが更新されません。 Altキーの場合もCtrlキーと同じように制限することはできないでしょうか。 お手数をお掛け致しますが、ご教授よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#18558
noname#18558
回答No.6

//event.keyCode = 0; event.returnValue = false return false; これでできました。 IE6でしか確認してませんが。 event.keyCode=0 の行があると、なぜかうまくいきませんでした。 この行をコメントにする、もしくは削除することでできると思います。

papillon68
質問者

お礼

解決です。 以下のような処理にしました。 禁止操作を prohibition_key_list に追加したり、 削除したりすることで簡単に制限できるようにしています。 この方がメンテナンスもしやすいためです。 貴重なお時間を割いてご教授頂き、本当にありがとうございました。 ------------------------------------------------- // 一度に投稿できないため、分割します。 // 投稿1 var prev1_key = 0; // 1つ前のキーコード var prev2_key = 0; // 2つ前のキーコード // ※禁止操作の一部です。 var prohibition_key_list = new Array(); // キーイベントで禁止するリスト prohibition_key_list['ctrl_r'] = new Array(17, 82); // 更新(Ctrl+R) prohibition_key_list['alt_prev'] = new Array(18, 37); // ページを一つ前に戻す(Alt+「←」) prohibition_key_list['alt_next'] = new Array(18, 39); // ページを一つ進める(Alt+「→」) prohibition_key_list['f5'] = new Array(); prohibition_key_list['f5'][0] = 116; // 更新(F5) // キーダウンイベントの禁止 document.onkeydown = prohibition_key_event; // キーイベントの制限関数 function prohibition_key_event() { var keys = null; for(keys in prohibition_key_list) { if(prohibition_key_list[keys].length == 2) { // 投稿2へ -------------------------------------------------

papillon68
質問者

補足

DQ9様、ご返信ありがとうございます。 「event.keyCode = 0;」 をコメントとすることで思惑通り処理できました。 ただし、F1~F12までのキーは event.keyCode = 0 としないと 実行されてしまいます。 F1~F12が押されたときには event.keyCode = 0 を通そうと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#3>▲処理は通りますが、Alt+←などの制限はできませんでした。 ほんとですね。 「Alt+←」でウチで実行した場合戻ることができなかったのは、 通過チェックのために追加したアラートのためのようです。 (そうすると、キャンセルされます、多分イベントバブルがキャンセルされるため) } else if((event.altKey) && (event.keyCode==37)) { alert('"Alt+←"はキャンセルされました!'); event.keyCode = 0; return false; }

papillon68
質問者

お礼

解決です。 BLUEPIXY様、貴重なお時間を割いてご教授頂き、本当にありがとうございました。 DQ9様のお礼で書いたコードの続きです。 ------------------------------------------------- // 投稿2 if((prohibition_key_list[keys][0] == prev1_key) && (prohibition_key_list[keys][1] == event.keyCode)) { prev2_key = prev1_key; prev1_key = event.keyCode; //event.keyCode = 0; return false; // 第1キーがShiftキーの場合 } else if((prohibition_key_list[keys][0] == 16) && (shiftKey_down()) && (prohibition_key_list[keys][1] == event.keyCode)) { prev2_key = prev1_key; prev1_key = event.keyCode; //event.keyCode = 0; return false; // 第1キーがCtrlキーの場合 } else if((prohibition_key_list[keys][0] == 17) && (ctrlKey_down()) && (prohibition_key_list[keys][1] == event.keyCode)) { prev2_key = prev1_key; prev1_key = event.keyCode; //event.keyCode = 0; return false; // 第1キーがAltキーの場合 } else if((prohibition_key_list[keys][0] == 18) && (altKey_down()) && (prohibition_key_list[keys][1] == event.keyCode)) { prev2_key = prev1_key; prev1_key = event.keyCode; //event.keyCode = 0; return false; } // 投稿3へ -------------------------------------------------

papillon68
質問者

補足

BLUEPIXY様、ご返信ありがとうございます。 alert()を入れることで制限することができました。 ただし、アラートが出てストレスを与えてしまうため、 他の方法を取ろうと思います。 折角お時間を頂いたのに申し訳ありません。 DQ9様の方法を参考にさせて頂こうと思います。 本当にありがとうございました。

すると、全ての回答が全文表示されます。
noname#19175
noname#19175
回答No.4

CtrlもALTのトラップ(?)も出来ました。m(_ _)m しかし、 Alt+Fでファイルメニューを表示させたり、ALT+矢印で「戻る」「進む」を抑制することは出来ませんでした。 やはりセキュリティーにも関係していると思います。 (WindowsXP Home SP2 IE6) IE6はCtrl+WやCtrl+CやCtrl+Vも制御できますね。 Ctrl+C/Vはユーザビリティーだけですが、閉じられないのはセキュリティー的に危なそうな気がしますが、、、 (ALT+F4が動けば良いってことなのかな?)

papillon68
質問者

お礼

解決です。 taloo様、貴重なお時間を割いてご教授頂き、本当にありがとうございました。 BLUEPIXY様のお礼で書いたコードの続きです。 ------------------------------------------------- // 投稿3 } else if(prohibition_key_list[keys].length == 1) { if(prohibition_key_list[keys][0] == event.keyCode) { prev2_key = prev1_key; prev1_key = event.keyCode; //event.keyCode = 0; if((112 <= event.keyCode) && (event.keyCode <= 123)) { event.keyCode = 0; } return false; } } } prev2_key = prev1_key; prev1_key = event.keyCode; return true; } -------------------------------------------------

papillon68
質問者

補足

taloo様、ご返信ありがとうございます。 はい、ツールバーのメニューを表示させるショートカットは制限することはできませんでした。 F1~F12までのキーは event.keyCode = 0 としないと 実行されてしまいました。 それ以外のキーの場合(Alt+←など)は event.keyCode = 0 をコメントとすることで対応できました。 ※ただし、Alt+F4やF1などは制限できません。  また、強制終了系の制限はやめました。(Ctrl+Wなど)

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1補足> ウチの環境は、XPPro+IE6SP2ですが、 #1のコードでALT+←をトラップ&キャンセルできました。

papillon68
質問者

補足

BLUEPIXY様、ご返信ありがとうございます。 [環境] OS: WinXPPro SP2 ブラウザ: IE6.0.2900.2180.xpsp_sp2.gdr.050301-1519 SP2 if(event.keyCode==18) { /* 処理 */ } ▲処理は通りますが、Alt+←などの制限はできませんでした。

すると、全ての回答が全文表示されます。
noname#19175
noname#19175
回答No.2

ALT自体がトラップできないのでは? システムに関係する部分もありますし、そういうのが制御できると、セキュリティーホールになる可能性があります。 WindowsならALT+F4でアプリケーションを強制終了できますが、 もしALTを無効化できれば、 ALT(ALT+F4)を無効化させたブラクラを、ALT+F4で停止させられなくなります。 それ以外にもユーザーから見れば害となりそうな点は多々ありますし。 accesskey属性というのがありますので、リンクを簡単にするだけなら、accesskeyでもできますね。 (携帯電話を想像してもらえればわかると思います) リンク先がjavascript:history.back()だったら、キーを押すだけで履歴を戻ることも出来ると思います。

papillon68
質問者

補足

taloo様、お返事ありがとうございます。 確かにAlt+F4で強制終了できなければ、困りますね。 Ctrl+Alt+Deleteと同じようにAltの制限ができないことは Windowsの仕様(ユーザを守るため)ということですね。 言われてみれば納得できます。 また、ブラウザの機能を抑制してしまうことは、 ユーザの使い勝手を悪くすることにつながりますね。 ------------------------------------------------ Ctrlについては制限ができるため 「Ctrl+W」でのブラウザの終了は無効にできました。 ------------------------------------------------ accesskeyについての貴重なご意見ありがとうございます。 私自身今回のことを調べている中でaccesskeyにより、 ショートカットが作成できることが分かりました。 <input type="text" accesskey="a"> Alt+Aキーで上記のテキストボックスへフォーカス移動など 本当にありがとうございました。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

onkeypress イベントを使っているのではないですか? 試してないのですが、 onkeydown イベントを使えばトラップできると思います。 http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/events/onkeydown.asp

papillon68
質問者

補足

お返事ありがとうございます。 イベントは「onkeydown」で行っています。 実際の使用例を記載し忘れ、申し訳ありません。 js.js ---------------------------------------------- document.onkeydown = prohibition_key_event; function prohibition_key_event() { // 更新の制限(Ctrl+R) if((event.ctrlKey) && (event.keyCode==82)) { event.keyCode = 0; false; // Altキー+←キーの制限 } else if((event.altKey) && (event.keyCode==37)) { event.keyCode = 0; return false; } } ---------------------------------------------- html.html ---------------------------------------------- <html> <head> <script language="JavaScript" type="text/javascript" src="js.js"></script> </head> <body> ・ ・ ・ </body> </html> ---------------------------------------------- のように記述しています。 よろしくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A