私はちょうどこの煩わしさに遭遇し、答えを探しているときにこの質問を見つけたので、ここに私の調査と解決策の詳細を示します (まあ、回避策)。
バックスペース キーが押されたときに、 Blackberry ブラウザの または 要素でandイベントkeyup
がkeydown
トリガーされません。ただし、イベント ハンドラーが以下にバインドされている場合にトリガーされます。input
textarea
document
$("#myInput").keydown(someFn); //Will not fire for backspace
$(document).keyup(someFn); //Will fire for backspace
なぜそうなのか、まったくわかりません。イベントはバブリングするkeyup
はずですが、バックスペース キーを押しても発生しないため、あまり役に立ちません。
ただし、別のイベントがあります。このinput
イベントは Blackberry ブラウザーでサポートされており、要素の値が変更されるたびに (幸いなことに、その変更がバックスペース キーの押下によるものである場合を含めて) 正しく発生します。
keydown
したがって、イベント ハンドラーを と の両方にバインドすることで、問題を回避できますinput
。keydown
イベントはの前input
に発生しますが、バックスペース キーが押された場合keydown
は発生しません。したがって、それを非常に簡単に追跡できます。
function handler(e) {
if (e.keyCode === 8) {
alert("Backspace!"); //Backspace was pressed :)
}
}
var elem = document.getElementById("example");
elem.addEventListener("keydown", function (e) { //Bind to keydown event
this.keydownFired = true; //Remember that keydown fired in expando property
handler.call(this, e); //Call the event handler
}, false)
elem.addEventListener("input", function (e) { //Bind to input event
if (!this.keydownFired) { //Keydown didn't fire, must have pressed backspace
e.keyCode = 8; //Fix the event object
handler.call(this, e); //Call the event handler
}
delete this.keydownFired; //Clean up so we can handle next key press
}, false);
いくつかのメモ:
私が知る限り、これは Blackberry 6 のブラウザーの問題にすぎません。Blackberry 5 (物理デバイスとシミュレーター) と 7 (シミュレーター) をテストしましたが、どちらもバックスペース キーに対してイベントkeydown
とイベントを発生させます。keyup
この「修正」は、Opera Mobile (バージョン 12 でテスト済み) を除いて、私がテストしたほとんどすべてのブラウザーで機能します (他のブラウザーを壊すことなく Blackberry 6 を適切にサポートするために使用できます) input
。時々2回。
これにより、入力に削除するテキストがある場合にのみ、バックスペースの押下を検出できます (そうでない場合、input
イベントは発生しません)。これはおそらくスクリプトの最大の欠点です。
ここで動作する例を見つけることができますが、モバイル デバイスのテストでは、埋め込みバージョンをロードする方が高速です。