2011-07-17 12 views
3

.を押すと、​​,keypressおよびkeyupの3つのイベントが発生します。私はdeleteを押すとChromeでキーボードを押したときに `delete`と` .`を検出する方法は?

keydown 
    which: 190 == ¾ 
    keyCode: 190 == ¾ 

keypress 
    which: 46 == . 
    keyCode: 46 == . 

keyup 
    which: 190 == ¾ 
    keyCode: 190 == ¾ 

それは2つのイベント、​​とkeyupを発射します。

keydown 
    which: 46 == . 
    keyCode: 46 == . 

keyup 
    which: 46 == . 
    keyCode: 46 == . 

私は.を押すと、対応する文字(46 == .)を取得できるようにしたいです。しかし、​​およびkeyupには、190があり、これは¾です。 keypressでは正しい値を取得しますが、deleteを押すとこのイベントは発生しません。

deleteを押すと、​​とkeyupにコード46が表示されます。コード46deleteではなく.です。

.が押されたか、deleteキーであった場合、両方のキーをキャプチャしてその違いを通知するにはどうすればよいですか?テストへ

ページ:http://jsfiddle.net/Eg9F3/

+0

jsfiddle.netで説明できますか? – ChristopheCVB

+0

@Christophe http://jsfiddle.net/Eg9F3/ – BrunoLM

+0

まあ、 'delete'は文字に対応していません。昔は、キャラクターの価値が低いと考えられていましたが、それは今のところどのように機能しているのでしょうか。だからあなたはここでシナリオを2つ持っており、それらを区別する必要があります。あなたが解決しようとしている実際の問題は何ですか? –

答えて

1

私は最善の解決策が押されたものをキー相互参照にe.whichを使用し、その後、あなたがしたいキー(demo)をマッピングすることだと思うのFirefox、example on jsFiddle

$("textarea").keydown(function(e) { 
    // if the key pressed was found on the list of specialChars 
    if (specialChars[e.keyCode]) 
    { 
     // triggers the fake event 
     $("textarea").trigger("chromekeypress", e); 

     // temporary avoid keypress from firing 
     $("textarea").unbind("keypress"); 
     setTimeout(function(){ $("textarea").bind("keypress", handleKey); },10); 
    } 
}); 

$("textarea").keypress(handleKey); // main event 

$("textarea").bind("chromekeypress", chromeKeyPress); // chrome workaround 

function chromeKeyPress(i,e){ 
    e.type="chromekeypress"; 
    e.which = 0; // copy Firefox behavior, which == 0 means a special key pressed 
    handleKey(e); // fires the main event 
} 
function handleKey(e) { 

    // which is going to be 0 if it is a special key 
    // and keycode will have the code of the special key 
    // or 
    // which will have the value of the key 

    $("#r").html($("#r").html() + "\n" + 
     e.type + "\n" + 
     " which: " + e.which + " == " + String.fromCharCode(e.which) + "\n" + 
     " keyCode: " + e.keyCode + " == " + String.fromCharCode(e.keyCode) + "\n" + 
    ""); 
} 
0

「キー入力」ハンドラで「」の値が「KeyDownイベント」または「からkeyup」ハンドラで「これ」と同じ意味を持ちません。キーボードのキーの場合は、キーボードの場合はの場合はであり、文字の序数ではありません。 "keypress"ではそれは文字ですが、あなたが気付いたように、Delの "keypress"は得られません。

したがって、これはDelの「keydown」イベントと「keyup」イベントの場合とは異なり、「keypress」ハンドラの「46」とは異なります。

「keydown」または「keyup」のいずれかを使用して、キーコードを確認する必要があります。

1

実際、それは奇妙ですが、それは論理です。

関数に、String.fromCharCodeはないKBアクションで、実際の文字コードで作業している(左、削除...)

なぜ単にのkeyCodeによってフィルタリングしませんか?

2

と同じ動作を強制しました。クロスブラウザkeyCodeの値のgood referenceがあります.jQueryはe.whichの値を正規化するため、この場合に機能します。

var keys = { 
    46 : 'del', 
    190 : '.' 
}; 

$("textarea").bind('keyup', function(e){ 
    $('#r').append('keyup (' + e.which + '): ' + (keys[e.which] || String.fromCharCode(e.which))); 
}); 

これはjQuery UIが使用する方法と同様である - ファイルの先頭にキーコード相互参照を参照してください?また、それは私がkeycasterプラグインで使用する方法です。

関連する問題