2012-02-01 18 views
7

これはおそらく意図した動作または少なくともjQuery/jsの問題ではありませんが、キーが押されたときにjQueryキー押しイベントが繰り返し発生しますが、すべてのキーには反映されません

$(document).bind('keypress', function(e){ 
    switch(e.keyCode) 
    { 
     case 37: 
      console.log('left cursor keydown, will fire on hold'); 
      break; 
     case 39: 
      console.log('right cursor keydown, will fire on hold'); 
      break; 
     case 80: 
      console.log('p will only fire once per press!'); 
      break; 
    } 
}); 

あなたはまた、jQueryのドキュメントでの例で遊ぶことができます:

には、次のテイクhttp://api.jquery.com/keypress/左または右カーソルが押され

(例えばA,E,[,などとして、あるいは他の多くのキー)、イベントが発生し、コンソールに素晴らしいログメッセージが表示されます。すべて細かい&です。しかし、今度はキーを押し続けてください。一時停止後、キーを押したときにキーダウンイベントが複数回発生することがわかりますが、p(たとえば、j)に当たってみると、一度。

私はFF 9.0.1とmac OSX 10.7.1とjQuery 1.7.1を使ってこれをテストしています。

これは設計によるものですか、ブラウザに依存する機能ですか、それともOSやキーボード自体と関係していますか?また誰もが繰り返すキーのリストを持っていますし、そうでないキーもありますか?

実際には使用されていない限り、これはカーソル・プレスにアニメーションをバインドしたときに切り取られ、キーが押されたときに奇妙な動作が見られるようになりました。私の回避策は、代わりにkeyup()イベントを使用し、イベントでpreventDefault()を使用して、カーソルを停止して画面をスクロールさせました。

更新: keypressイベントでは、ほとんどの文字でkeyCodeが常に0であると思われます。なぜなら、ハンドラが1度だけ起動したと思った理由と関係するかもしれません。もう少しテストを重ねると、カーソルのような繰り返しログエントリが表示されます。あなたががjQueryのAPIのページをチェックして、その上でデモを使用している場合、それは私が記述した挙動を示す:/

+0

すべてのキーが繰り返されます。意図的に抜けていない限り、各スイッチケースの最後に 'break'を追加する必要があります。あなたのキーボードが誤動作しているか、あなたのコードが何らかの 'break'を必要としているだけです。 –

+0

私のためではありません - "p"はうまく繰り返します。私はそれがあなたのキーボードのハードウェア/ファームウェアの機能だと思います。 – Pointy

+0

@BrianGrahamはちょうどそれを見つけた、感謝:) jsfiddleでこれをもう一度テストした後、私はすべてのキーにも繰り返しを見ている - しかし、keyCode attrは、私が奇妙な行動のいくつかを説明するkeypressイベントのほとんどのキーで0です見ていた – jammypeach

答えて

5

行動ブラウザとオペレーティングシステム間で異なります。http://api.jquery.com/keypress/

それでも自分がいることを説明することはできません。次のページは、セクション2.2で詳細に自動繰り返しキーイベントの話題を取り上げます。

http://unixpapa.com/js/key.htmlまた

+0

偉大な - これは完璧に、おかげでそれを説明します。 – jammypeach

0

- この記事を閲覧すべての人々の利益のために:してみてください「のkeydown」方法

キー入力が複数回トリガーされます... KeyDownイベントはありません

http://jquerymobile.com/demos/1.0a2/experiments/api-viewer/docs/keypress/index.html

+4

'Keydown'は実際には(少なくとも最新のGoogle Chromeで)繰り返します。それをここで試してみてください: '$(document).on( 'keydown'、function(ev){console.log(ev)})' – Juribiyan

1

この問題は、年齢の周りされていますが、私はちょうど今修正を発見したと思います。 これは正常に動作するようです。

$("#search_query").keyup(function(event) { 

    //this will void fake keypresses 
    if(event.charCode == 0 && event.keyCode == 0) { 
     return false; 
    } 

    //place the rest of you code here 
}); 
+0

そのアイスクリームは滑らかで...すばらしい! –

関連する問題