• ベストアンサー

うまく動作しないのはなぜ?

shift、→、↓の3つのキーにのうち、1つだけ押すとブラウザに「1」を表示、2つ押すと「2」を表示、3つとも押すと「3」を表示する、という動作のjava scriptを書きました。(初心者です) ところが3つ押した場合なぜか動作してくれません。「→」ではなく「←」キーで行った場合はちゃんと「3」が表示されるのですが…。 原因がわからず困ってます。どなたかお助け下さい。 こちらの環境はwindowsXPでIE(バージョン6)です。 ソースも載せておきます。 <html> <head> <script type="text/javascript"> document.onkeydown = keydown; document.onkeyup = keyup; var shift=0, right=0, back=0; function keydown(){ switch(event.keyCode){ case 32: shift=1; break; case 39: right=1; break; case 40: back=1; break; } } function keyup(){ switch(event.keyCode){ case 32: shift=0; break; case 39: right=0; break; case 40: back=0; break; } } function timer(){ window.setTimeout("timer();", 20); document.getElementById("shift+right+back").innerHTML = shift + right + back; } </script> </head> <body> <script> timer(); </script> shift+right+back=<p id="shift+right+back"></p> </body> </html>

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

  • ベストアンサー
回答No.2

ソースコードが正しいとすると、キーボード自体が3つボタンの同時押しに対応していないのかもしれません。 これはキーボードの構造上の問題となるので、もしコレが原因であるのならば、別の対応しているキーボードで試すしかないです。 私のキーボードは3つボタン同時押しができないので、 シューティングゲームをやっていて、「攻撃ボタンを押しながら、斜め移動」というのができなくて困った経験があります^^; 以下に、その問題を説明してあるページのURLを載せておきますね。 http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20040701/3/?ST=ittrend http://www.donburi.to/~from/dtxmania/qa/threekeys.html

kk-ponpon
質問者

お礼

他のキーボードでやってみたら動作しました。 ただ、今まで使ってたキーボードでも「space、←、↓」の3つ同時押しならちゃんと動いていたんです。それが「space、→、↓」だと動作しないので変だなと思っていたんですが、そういう仕様だったのかもしれません。 ありがとうございました。

その他の回答 (1)

  • You_are
  • ベストアンサー率20% (23/114)
回答No.1

基本的な動きは大丈夫だと思います。 問題なのは、case文でキーを押した時に分岐していますが、その値が妥当かどうかでは無いでしょうか? 参考URLの様に、alertで押したキーの値を見る方法も有りますし、 下のサイトを見て見るのも良いかも知れません。 http://d.hatena.ne.jp/teramako/20070215/firefox_event_keyCode_and_charCode

参考URL:
http://developer.mozilla.org/en/docs/DOM:event.keyCode
kk-ponpon
質問者

補足

すみません、質問を間違えてました。 shiftキーではなくspaceキーです。 space、→、↓の3つのキーのうち、3つ押したときの動作が上手くいかなかったんです。 ちなみにキーの値は正しいと思うのですが…

関連するQ&A

  • WM_KEYDOWNでPrtScを捕まえる方法??

    ごく普通のウィンドウプロシージャでキーの判別を行っています 下記のように条件(1)が WM_KEYUP の際には(2)、(3)ともに検出します LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYUP: ............ (1) switch(wp) { case VK_RETURN: { break; } ..... (2) case VK_SNAPSHOT: { break; } ..... (3) default: { break; } } break; } return; ところが条件(1)を WM_KEYDOWN に変更すると(2)の Enter は検出しますが、(3)の PrtSc を検出してくれません 質問1 なぜ PrtSc を WM_KEYDOWN では検出しないのですか? 質問2 WM_KEYUP WM_KEYDOWN のいずれか一方にしか反応しないキーはまだありますか? 質問3 どのようにしたら PrtSc の WM_KEYDOWN を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • 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; どうすれば実現できるのか、教えてください。

  • エクセルBVAのフォーム式のKeyCode~の意味がわかりません

    エクセルBVAです Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyDown Then KeyCode = 0 End If End Sub ヘルプをみると キーを押したとき、およびキーを離したときに続いて発生します。KeyDown イベントはキーを押すと発生し、KeyUp イベントはキーを離すと発生します。 キーってenterのことですかね? なら、 If KeyCode = vbKeyDown Then KeyCode = 0 End If で、KeyCodeを0ににするってどういうことでしょうか?

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

    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> なにか解決方法ありますでしょうか。 よろしくお願いします。

  • ステータスバーについて

    1 画像にマウスをおくと、ステータスバーに詳細が表示されるように設定したのですが、マウスをはずしても表示されっぱなしになります。マウスをはずしたら、何も表示されないようにするにはどうしたらいいのでしょうか? 2 「1」で、表示したものをスクロールさせたいのですが、スクリプトをどうくみあわせればいいのかわかりません。教えてください。 「1」のスクリプトを表示するので、できればこれをもとにおしえてください。 <SCRIPT language="JavaScript"> <!-- function msg(num){ switch(num){ case 0: text = "ρ(^^ )ノ サァドーゾ!!"; break; case 1: text = "e(^。^)g_ファイト!!"; break; case 2: text = "(;^_^A アセアセ・・・"; break; case 3: text = "(^ー^)ノ ヨロシク "; break; case 4: text = "さようなら~(^o^)/~"; break; } document.form1.text1.value = text; } //--> </SCRIPT>

  • キーコードなどで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("キーコード"); } }

  • document.write と Firefoxの戻り動作

    document.writeを使ってhtmlを書き込むことで新たなページを表示した場合、Firefoxではブラウザの「戻りボタン」で戻ると元のページの表示位置(元のページがスクロールされていた場合のスクロール位置)ではなく、元のページの先頭から表示されます。 (IEでは、元のページの元の表示位置に戻ります。) FirefoxでもIEのように元のページの元の表示位置に戻るようにしたいのですが、何が問題か、ご指摘いただけないでしょうか? (下方にサンプルを記載します) ・行いたいこと  以下の例のfunction_test()内に別ページのhtmlを記述して、onlickで呼び出しそのhtmlを表示。そのhtml表示後、ブラウザの戻りボタンや、history.backを使って、元のページに普通に戻りたい。 <html> <head> <TITLE>test</TITLE> <script type="text/javascript"> <!-- function function_test() { document.write("<html><body>"); document.write("test"); document.write("<\/body><\/html>"); document.close(); } // --> </script> </head> <body> これはテスト<br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> <form> <input type='button' value='test' onclick='function_test()'> </form> <br><br><br><br><br><br><br><br><br><br><br><br><br><br> </body> </html>

  • jsでキーボード入力は同時にできますか?

    let EEvent = new KeyboardEvent( "keydown", { keyCode: 40 }); let CEvent = new KeyboardEvent( "keydown", { keyCode: 17 }); document.dispatchEvent( EEvent ); completion(); これだと片方しか発生させられないのですが同時に入力判定を出すスクリプトはありますか?

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

    こんにちわです。 タイトル通りなのですが、 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など使用されたくないのですが・・・ 入れ替えなどでも良いのですが。。。 宜しくお願いします。

  • javascriptの打ちミスしてる所を知りたい。

    参考書の通り打ちました。参考書では、蛇を上下左右キーで操作し、餌を食べさせるゲームと書いておりましたが、灰色のイメージが出るだけで、蛇っぽいのは出ません。 たぶんどっかでタイプミスしてると思うのですが、どこだかわかりません。 教えてください。 <!DOCTYPE html> <html> <head> <title>SnakeBite</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script type="text/javascript"> var W,H,S=20; var snake=[],foods=[]; var keyCode=0; var point=0; var timer=NaN; var ctx; function Point(x,y){ this.x=x; this.y=y; } function init(){ var canvas = document.getElementById('field'); W=canvas.width/S; H=canvas.height/S; ctx =canvas.getContext('2d'); ctx.font ="20px sans-serif"; snake.push(new Point(W/2,H/2)); for(var i=0; i<10;i++){ addFood(); } timer=setInterval("tick()",200); window.onkeydown =keydown; } function addFood(){ while(true){ var x =Math.floor(Math.random()*W); var y =Math.floor(Math.random()*H); if(isHit(foods,x,y)|| isHit(snake.x,y)){ continue; } foods.push(new point(x,y)); break; } function isHit(data,x,y){ for(var i=0;i<data.lenght;i++){ if(data[i].x==x && data[i].y==y){ return true; } } return false; } function moveFood(x,y){ foods =foods.filter(function(p){ return(p.x !=x || p.y !=y); }); addFood(); } function tick(){ var x=snake[0].x; var y=snake[0].y; switch(keyCode){ case 37:x--;break; case 38:y--;break; case 39:x++;break; case 40:y++;break; defaule:paint(); return; } if(isHit(snake,x,y) || x<0 ||x>=W || y<0||y>=H) { clearInterval(timer); paint(); return; } snake.unshift(new Point(x,y)); if(isHit(foods,x,y)){ point+=10; moveFood(x,y); }else{ snake.pop(); } paint(); } function paint(){ ctx.clearRect(0,0,W*S,H*S); ctx.fillStyle="rgb(256,0,0)"; ctx.fillText(point,S,S*2); ctx.fillStyle="rgb(0,0,255)"; foods.forEach(function(p){ ctx.fillText("+",p.x*S,(p.y+1)*S); }); snake.forEach(function(p){ ctx.fillText("*",p.x*S,(p.y+1)*S); }); } function keydown(event){ keyCode=event.keyCode; } </script> </head> <body onload="init()"> <canvas id="field" width="400" height="400" style="background:#cccccc"> </canvas> </body> </html>

専門家に質問してみよう