• 締切済み

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()をいれると無効化できるといった記述も見たのですが、 今回はその方法は使わずに実装する予定です。 どなたか方法をご存知でしたら、ご教授ください。 (コメントアウトしているものも試しましたが、うまくいきませんでした)

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

よくわかってませんが・・・ ドキュメントレベルでのイベント処理なので、バブリングをキャンセルしても処理されてしまっているのかな? 確認はしていませんが、キャンセルできない場合の対処法のアイデアとして、ctr++が入力されたらctr+-のキーイベントを発火させるといった要領で打消すことができるのではないかと想像します。 ただし、ご提示のようにkeydown、keyupの両方を取得して発火させると、キー入力に対して打消すイベントを起こしすぎになると思いますのでご注意を。

XenoneX
質問者

お礼

解答ありがとうございます。 イベントの打消しは考えていたのですが、ご忠告の通り、 無限イベント対策などを考えるのが面倒になったため、 抑止の方法を模索してました。 ただ、やはり抑止は出来ないようなので、 とりあえずは打消しイベント発火で対策しておこうと思います。

  • DoubtOwl
  • ベストアンサー率50% (63/124)
回答No.1

http://answers.microsoft.com/ja-jp/ie/forum/ie8-windows_7/ie8ctrl%E3%83%97%E3%83%A9%E3%82%B9%E3%81%AE/8e79b0af-228c-4152-aaaf-36fc0f57fbb1?msgId=7660d4d6-740c-486e-b49c-ecd563a72085 無理な様です。 ブラウザの機能ですしね・・・ http://okwave.jp/qa/q6127224.html bodyのCSSを変更する手もあるようですが動かしてみると微妙でした。

XenoneX
質問者

お礼

解答ありがとうございます。 やはり無理ですか…。 抑止はあきらめて、別の方法で対処したいと思います。

関連するQ&A

  • 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)

  • キーボードショートカットで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; } }

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

    こんにちわです。 タイトル通りなのですが、 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キー+○キーでのショートカットの制御

    お世話になります。 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キーと同じように制限することはできないでしょうか。 お手数をお掛け致しますが、ご教授よろしくお願い致します。

  • IEでF12を押さないとjavascriptが…

    javascript初心者です。 サイトのログインページに、 IDとpasswordを保存する機能をを作りたいと考えています。 プログラムからjavaccriptを呼び出しているのですが、 IEからそのjavascriptが読み込まれなくなってしまいました。 (Chrome,FireFox,Operaでは正しく動作しています。) F12を押してIEの開発者ツールを立ち上げると、正しく動作するようになります。 なぜ、F12を押さないと呼ばれないのかが、 さっぱりわからず、教えていただけないでしょうか。 htmlソースにも記述されています。 呼び出し元は、tclです。 <script language="JavaScript"> var rwAuthInfo = { conf : { kwordId : 'auth_id', kwordPass : 'auth_pass', savePeriod : 120, idElemKey : 'authId', passElemKey : 'authPass', chkElemKey : 'authSave' }, CookieWrite : function(kword, kdata, kday) { if (!navigator.cookieEnabled) { return; } var sday = new Date(); sday.setTime(sday.getTime() + (kday * 1000 * 60 * 60 * 24)); var s2day = sday.toGMTString(); document.cookie = kword + "=" + escape(encodeURIComponent(kdata)) + ";expires=" + s2day + ";path=/"; }, CookieRead : function(kword) { if (typeof(kword) == "undefined") { return ""; } kword = kword + "="; var kdata = ""; var scookie = document.cookie + ";"; var start = scookie.indexOf(kword); if (start != -1) { end = scookie.indexOf(";", start); kdata = decodeURIComponent(unescape(scookie.substring(start + kword.length, end))); } return kdata; }, getAuthInfo : function() { console.log("get auth info"); var myPass = decodeURIComponent(unescape(rwAuthInfo.CookieRead(rwAuthInfo.conf.kwordPass))); var obj1 = document.getElementsByTagName('input'); for(i = 0; i < obj1.length; i++){ if ( obj1[i].id == rwAuthInfo.conf.passElemKey && myPass != "" ) { obj1[i].value = myPass; } } var myId = rwAuthInfo.CookieRead(rwAuthInfo.conf.kwordId); var obj2 = document.getElementsByTagName('input'); for(i = 0; i < obj2.length; i++){ if ( obj2[i].id == rwAuthInfo.conf.idElemKey && myId != "" ) { obj2[i].value = myId; } } console.log("From cookie - id: " + myId + ", password: " + myPass); }, saveAuthInfo : function() { console.log("save authentication info"); var objChk = document.getElementById(rwAuthInfo.conf.chkElemKey); if ( objChk.type == "checkbox" && objChk.checked ) { var obj1 = document.getElementById(rwAuthInfo.conf.passElemKey); if ( obj1.value != null && obj1.value != '' ) { var myPass = escape(encodeURIComponent(obj1.value)); console.log("password: " + obj1.value + ", encoded: " + myPass); rwAuthInfo.CookieWrite(rwAuthInfo.conf.kwordPass, myPass, rwAuthInfo.conf.savePeriod); } var obj2 = document.getElementById(rwAuthInfo.conf.idElemKey); if ( obj2.value != null && obj2.value != '' ) { var myId = escape(encodeURIComponent(obj2.value)); rwAuthInfo.CookieWrite(rwAuthInfo.conf.kwordId, myId, rwAuthInfo.conf.savePeriod); } } }, addSubmitEvent : function() { for ( i=0; i<document.forms.length; i++ ) { var frm = document.forms[i]; try { frm.addEventListener('submit', rwAuthInfo.saveAuthInfo, false); } catch (e) { frm.attachEvent('onsubmit', rwAuthInfo.saveAuthInfo); } } }, addLoadEvent : function() { try { if (window.addEventListener) { window.addEventListener('load', rwAuthInfo.getAuthInfo, false); window.addEventListener('load', rwAuthInfo.addSubmitEvent, false); } else if (window.attachEvent) { var isMSIE = /*@cc_on!@*/0; if (isMSIE) { window.attachEvent('onload', rwAuthInfo.getAuthInfo); window.attachEvent('onload', rwAuthInfo.addSubmitEvent); window.attachEvent('load', rwAuthInfo.getAuthInfo); window.attachEvent('load', rwAuthInfo.addSubmitEvent); } else { window.attachEvent('onload', rwAuthInfo.getAuthInfo); window.attachEvent('onload', rwAuthInfo.addSubmitEvent); } } } catch (e) { console.error("got error in addLoadEvent: " + e); window.attachEvent('onload', rwAuthInfo.getAuthInfo); window.attachEvent('onload', rwAuthInfo.addSubmitEvent); } } } rwAuthInfo.addLoadEvent(); </script>

  • 「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()を付加すると機能抑止できますが、それ以外で実現可能なのでしょうか? 宜しくお願い致します。

  • 一部のテキストだけのKEYCODEを有効にしたい

    四苦八苦している初心者です。よろしくお願いします。 バックスペースキーを以下のように無効にしています。 window.document.onkeydown = function () {if (event.keyCode == 8) {event.keyCode = null; return false;}} フォームに有効にしたいテキストが存在するのですが、どのようにしたら有効になりますでしょうか? <input type="text" name="set" size="60" value="ABC"> 全体にバックスペースを無効にし、一部だけ解除したいという内容です。よろしくお願いします。

  • 日本語入力の禁止

    お世話になります。 divにcontenteditable属性を付与して編集できるようにしました。 そのとき、日本語は入力禁止にしたいのですがime-modeはdivには使用できないみたいです。 日本語入力のときはkeycode229が返ってくるようなのでjavascriptでonkeydownのときに if (event.keyCode == 229) { return false; } というif文を入れてみました。alertとかで確認するとちゃんと日本語入力の時にはこのif文を通過しているみたいなのですが 日本語が入力されてしまいます。 div contenteditable=trueのときに日本語入力を禁止したい場合はどのようにすれば実現できるのでしょうか。 <div contenteditable=true onkeydown="return test();">編集テスト</div> function test() { if (event.keyCode == 229) { return false; } return true; } よろしくお願いします。

  • Ajaxがおかしいんです

    Javascript初級者です。 Ajaxを使ってデータの重複チェックを行おうとしました。 ところがAjaxがヘンな動きをするんです。 以下のコードなんですが、上の登録処理の中で、function doubleCheck を呼んで います。 問題は2つあって、ひとつは実際に重複していてもしていなくても「true」を 返してくることです。 console.log("res=========" + res) には「yes」とか「no」とか重複有り無しで 異なりますが、ちゃんとそれぞれセットするにも関わらず、 if(!doubleCheck() では必ず「false」が戻ってきてしまいます。 もう一つおかしい点は、重複検索(これはPHPでやってます)の最中にもかかわらず、 「true」が返ってきて "重複があったので登録できません。" お、出てしまうことです。 それで調査するために console.logその2を入れてみました(※※※のところ)。 ところがこの console 何も吐き出しません。 ということは doubleCheck() の最後の if文にたどり着いていない、または 途中でエラーになっているのかもしれません。 私の書いた Ajax のコードがおかしいんでしょうか。 どなたか御指導下さい。 よろしくお願いします。 // 追加登録処理 function doActionAdd(){ if(dataCheck()){ // customerId が 空白か否かのチェック if($('#customerId').val() == ""){ if(window.confirm("追加登録していいですか?")){ if(!doubleCheck()){ window.alert("重複はありませんでした"); }else{ window.alert("重複があったので登録できません。"); }  (以下略) function doubleCheck(){ var yomi = $('#customerYomi').val(); var res = ''; // 重複チェック $.ajax({ type: "POST", url: "../customer/CustomerDoubleCheck.php", data: {"customerYomi":yomi}, dataType: 'text', // ajax通信が成功したときの処理 success: function(request){ console.log("request=========" + request); var json = JSON.parse(request); console.log(json[0].result ); res = json[0].result; console.log("res=========" + res); }, error: function(XMLHttpRequest, textStatus, errorThrown){ $('div#jobStatus').text("重複チェック検索ができませんでした。"); return false; } }); console.log("resその2=========" + res); //※※※ if(res == "yes"){ // 重複していたので「false」を返す。 return false; }else{ // 重複していなかったので「true」を返す。 return true; } }

専門家に質問してみよう