• ベストアンサー

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

  • ファンクションキー制御?

    こんにちわです。 タイトル通りなのですが、 JSでは、 function kdown(e) {var msg =""; var flg = 1; switch(window.event.srcElement.tagName){ case "INPUT" :if(event.srcElement.type != "text" && event.srcElement.type != "password" && event.keyCode!=9 && event.keyCode!=16 && event.keyCode!=32){return false;}else{flg=0;}break; case "TEXTAREA" :flg = 0;break; case "SELECT" :flg = 0;break; case "A" :flg = 2;break; } switch(event.keyCode){ case 8 :msg = "BS";break; case 78 :if(event.ctrlKey){msg = "Ctrl+N";}break; case 82 :if(event.ctrlKey){msg = "Ctrl+R";}break; case 116 :msg = "F5";break; case 122 :msg = "F11";break; } if(event.altKey){msg = "Alt";} if (flg == 0 ){switch(event.keyCode){case 8 :msg = "";break;case 13 :msg = "";break;}} else if (flg == 2 && event.keyCode==13)msg = ""; if(msg != ""){event.keyCode = 0;return false;}else{return true;} } document.onkeydown = kdown; こんな感じに制御するのを、 アクションスクリプトで制御出来ますか? HTMLにこのJS埋め込んでも、FLASHの所クリックして、 各キー押すと意味なくなってしまうので・・ F5やF11など使用されたくないのですが・・・ 入れ替えなどでも良いのですが。。。 宜しくお願いします。

  • Altを使ったショートカットキー無効の方法

    いつもお世話になってます。 javascriptで、IEのショートカットキーのいくつかを無効にしているのですが、 Altと組み合わせて使うショートカットキーの無効化ができずに困ってます。 例えば、Ctrl+Iでお気に入りを開く処理の無効化はこう実現できました。 function keydown() { if(event.ctrlKey & event.keyCode == 73){ event.keyCode = 0; return false; } } document.onkeydown = keydown; ですが、Alt+Dでアドレスバー選択の無効化は以下では実現できませんでした。 function keydown() { if(event.altKey & event.keyCode == 68){ event.keyCode = 0; return false; } } document.onkeydown = keydown; どうすれば実現できるのか、教えてください。

  • ctrl+vを無効にする方法

    タイトルのとおりなのですが、 javascriptで、キー制御(今回は、ctrl+v)をしたいのですが、どうすればよいのでしょうか? ちょっと、調べてみたのですが、 if( ((event.ctrlKey == true) && (event.keyCode == 86))) { event.returnValue = false; return false; } で、できるようなのですが、どのイベントに書けばよいのでしょうか? onkeydownとonkeyupでやってみましたが、ダメでした。 宜しくお願いします。 環境:Win2k(SP4)+IE6(SP1)

  • IE8におけるショートカットキーの無効化方法

    タイトルの通り、現在IE8環境で、ショートカットキーを無効にする方法を模索しています。 ネットで調べた結果、イベントを受け取ることまでは成功するのですが、 それを無効化することができません(一部のショートカットキー)。 現在試しているのが Ctrl++→拡大 Ctrl+-→縮小 の二つです。 htmlのバージョンは4.01 Strictを使用しています。 以下ソース window.document.attachEvent('onkeydown', onKeyEvent); window.document.attachEvent('onkeyup', onKeyEvent); function onKeyEvent(e){ if(!e) e = window.event; //確認用 //console.log("Key Code : " + e.keyCode); //console.log("Event Type : " + e.type); //console.log("Ctrl Key : " + e.ctrlKey); if(e.keyCode != 17){ if(e.ctrlKey){ switch(e.keyCode){ case 187: case 189: //e.keyCode = 0; e.returnValue = false; e.cancelBubble = true; //window.event = e; return false; } } } return true; } alert()をいれると無効化できるといった記述も見たのですが、 今回はその方法は使わずに実装する予定です。 どなたか方法をご存知でしたら、ご教授ください。 (コメントアウトしているものも試しましたが、うまくいきませんでした)

  • Altキーが使えない。

    タイトルのとおり、Altキーが使えません。 そのほかのキーは正常なのですが、 Alt+アルファベットやAlt+Ctrl+Deleteが、まったく認識されず、困っています。 ドライバは日本語PS/2-106/109Ctrl+英数です。 左右とも、同じAltキーが使えません。 ウイルスチェックはAvast!を自動更新させています。 ファイアーウォールはZoneAlarmを使ってます。 Win XP SP1 デスクトップのSONY/VAIOです。

  • 「Alt + ←」の機能(前のページに戻る)を抑止したい

    ◇環境 ブラウザ:Microsoft Internet Explorer 6.0 SP2 上記の環境で、「Alt + ←」の機能(前のページに戻る)をJavaScriptで抑止したいと考えています。サンプルとして、 window.document.onkeydown = altandArrowDisable(){  if(event.altKey && event.keyCode == 37) {   event.keyCode = 0;   return false;  }else{   return true;  } } と書いてみましたが機能(前のページに戻る)を抑止できません。 alert()を付加すると機能抑止できますが、それ以外で実現可能なのでしょうか? 宜しくお願い致します。

  • キーコードなどでAlt+○を認識してイベントを発生させるには?

    キーコードなどでAlt+○を認識してイベントを発生させるにはどうしたらよいのでしょうか?ひとつのキーでならできたのですが複数のキーを組み合わせることができませんでした。参考までにうまくいかなかったプログラムの関数部分を記述しておきます。このプログラムだと一回目はうまくいくのですが二回目になるとsキーを押すだけで実行されてしまいます。 document.onkeydown=keyDown; function keyDown() { keynum1=event.keyCode; if(keynum1==18)//この番号がキーに対応してる(Altキー) { document.onkeydown=pressEnter; } } function pressEnter() { keynum2=event.keyCode; if(keynum2==83)//この番号がキーに対応してる(sキー) { document.write("キーコード"); } }

  • キーボードショートカットでthickboxなどを起動したいのですが・・・・

    よろしくお願いいたします。 Webアプリのデザインを作成中なのですが、 javascriptでキーボードのショートカットキーを押してログイン画面を出したいと思い、できれば特定のキーを押したときにthickboxやlightboxでHTMLを表示できないかなと思っているのですが可能でしょうか? 以下のソースで一応Fキーを押すとリンクだけはできるのですが、 thickboxを定義するとなるとclassnameをどのように定義すればよいのでしょうか。 あまりJSの知識がないので、ご助力いただければ幸いです。 どうぞよろしくお願いいたします。 function shouldIgnoreInput(e) { var el = e.target || e.srcElement return el && el.tagName && (el.tagName.toUpperCase() == "INPUT" || el.tagName.toUpperCase() == "SELECT" || el.tagName.toUpperCase() == "TEXTAREA"); } function hotkey(e) { var nav4 = window.Event ? true : false; if(shouldIgnoreInput(e)) { return true; } if ((typeof e.ctrlKey != 'undefined') ? e.ctrlKey : e.modifiers & Event.CONTROL_MASK > 0) { return true; } if ((typeof e.altKey != 'undefined') ? e.altKey : e.modifiers & Event.ALT_MASK > 0) { return true; } if ((typeof e.metaKey != 'undefined') && e.metaKey) { return true; } else if((typeof Event != 'undefined') && (e.modifiers & Event.META_MASK > 0)) { return true; } if (nav4) var whichCode = e.which else if (e.type == "keypress") var whichCode = e.keyCode else var whichCode = e.button; if( whichCode == 114) { cancelEvent(e); window.location.reload(); return false; } else if( whichCode == 102 ) { cancelEvent(e); url = "login.html"; window.location.href = url; return false; } return true; } function cancelEvent(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; } }

  • インラインフレームのキーイベント

    IE7のインラインフレームでキーイベントを取得しようとしているのですが、オブジェクトがありませんとエラーになってしまいます。 こちら通常の場合は上手くいくのですが、 <html> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis"> <title>HTML Editor</title> <script type="text/javascript"> document.onkeydown = function(e) { var shift, ctrl; keycode = event.keyCode; ctrl = event.ctrlKey; shift = event.shiftKey; // キーコードの文字を取得 keychar = String.fromCharCode(keycode).toUpperCase(); // Ctrl同時押しの場合 if (ctrl) { if (keychar == "C") { alert('Ctrl+C'); } } } </script> </head> <body id="oBody"> <span id="editSpan"> <iframe id="oIframe" style="width:100%;height:50%"> </iframe> </span> </body> </html> 次のようにインラインフレームの中で行おうとするとエラーになってしまいます。 <html> <head> <meta http-equiv="content-type" content="text/html; charset=shift_jis"> <title>HTML Editor</title> </head> <body id="oBody"> <span id="editSpan"> <iframe id="oIframe" style="width:100%;height:50%"> </iframe> </span> <script type="text/javascript"> oIframe.document.onkeydown = function(e) { var shift, ctrl; keycode = event.keyCode; ctrl = event.ctrlKey; shift = event.shiftKey; // キーコードの文字を取得 keychar = String.fromCharCode(keycode).toUpperCase(); // Ctrl同時押しの場合 if (ctrl) { if (keychar == "C") { alert('Ctrl+C'); } } } </script> </body> </html> なにか解決方法ありますでしょうか。 よろしくお願いします。

  • Ctrlキー、Altキー、Shiftキーの違い、由来は?

    Ctrlキー、Altキー、Shiftキーの違い、由来が気になっています。キーボードの有効利用のための隠しコマンドだとすると、A,B,Cキーと言う表示でもいいような気がします。このキー歴史と割り当ての違いはどのようなものでしょうか?