JavaScriptリスナー、「keypress」はバックスペースを検出しませんか?


141

keypressリスナーを使用しています。

addEventListener("keypress", function(event){

}

しかし、これはテキストを消去するバックスペースを検出していないようです...

これを検出するために使用できる別のリスナーはありますか?

回答:


167

KeyPressイベントは、文字のみのために呼び出された(印刷可能)キーは、KeyDownイベントのイベントがすべてのような印刷不可能を含むために発生しControlShiftAltBackSpace、など

更新:

keypressイベントは、キーが押され、そのキーが通常は文字値を生成すると発生します

リファレンス


3
厳密には当てはまりません。多くの非表示キーkeypressは、多くのブラウザでイベントを発生させます。unixpapa.com/js/key.htmlを
Tim Down

Mozillaの現在のバージョンでは、バックスペースとすべてがkeypressイベントで検出されます。
iniravpatel 2017

70

keydown代わりに試してくださいkeypress

キーボードイベントがこの順序で発生します。keydownkeyupkeypress

バックスペースの問題はおそらくブラウザが戻ってナビゲートするkeyupため、ページにkeypressイベントが表示されないことです。


私は標準を調べていませんが、イベントの順序(少なくともFirefox 37では)はのようkeydown keypress keyupです。unixpapa.com/js/testkey.html
jxmallett

また、入力内のキーイベントのkeyup場合、イベントが発生するまで、キャラクターはフィールドに表示されません。
jxmallett 2015

最後の1つ-iOS(8.2)では、バックスペースキーはkeydownイベントを発生させるだけですが、その後しばらくの間、文字は入力から削除されません。
jxmallett 2015

これが答えです。これは、削除キーの押下とCtrl + Vキーの押下をキャプチャします
user1709076

30

keypressイベントには、ブラウザ間で異なる場合があります。

Jsfiddleを作成して、ChromeとFirefoxでキーボードイベント(JQueryショートカットを使用)を比較しました。keypressイベントを使用しているブラウザーに応じて、トリガーkeydown/keypress/keyupされるかトリガーされません-バックスペースはFirefoxでトリガーされますがkeydown/keyup、Chromeでのみトリガーされます。

トリガーされた単一のキークリックイベント

Chrome

  • keydown/keypress/keyupブラウザがキーボード入力を登録したとき(keypressが発生)

  • keydown/keyup キーボード入力がない場合(alt、shift、バックスペース、矢印キーでテスト)

  • keydown タブのみ?

Firefoxで

  • keydown/keypress/keyupブラウザがキーボード入力だけでなく、バ​​ックスペース、矢印キー、タブも登録するとき(入力がkeypressない場合でもここで起動されます)

  • keydown/keyup alt、shift


https://api.jquery.com/keypress/によると、これは驚くべきことではありません。

注:keypressイベントは公式の仕様ではカバーされていないため、使用時に実際に発生する動作は、ブラウザー、ブラウザーのバージョン、プラットフォームによって異なる場合があります。

keypressイベントタイプの使用はW3Cで非推奨になりました(http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress

keypressイベントタイプは、参照と完全性のためにこの仕様で定義されていますが、この仕様では、このイベントタイプの使用を廃止しています。コンテキストを編集する場合、作成者はbeforeinputイベントをサブスクライブできます。


最後に、質問に答えるには、keyupまたはkeydownを使用して、FirefoxとChromeのバックスペースを検出する必要があります。


ここで試してください:

$(".inputTxt").bind("keypress keyup keydown", function (event) {
    var evtType = event.type;
    var eWhich = event.which;
    var echarCode = event.charCode;
    var ekeyCode = event.keyCode;

    switch (evtType) {
        case 'keypress':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
            break;
        case 'keyup':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<p>");
            break;
        case 'keydown':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
            break;
        default:
            break;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input class="inputTxt" type="text" />
<div id="log"></div>


1
素晴らしい回答-主にブラウザー間でバックスペースを処理するさまざまな方法の説明
Jivan

2
W3Schoolはすでにそれを行っている:w3schools.com/jsref/...
タン

1
コードスニペットは非常に役に立ちました
ジョンギルマー

17

誰かがフォームフィールドにいると思っているときにバックスペースを押すという問題に遭遇した場合に備えて書いたもの

window.addEventListener("keydown", function(e){
    /*
     * keyCode: 8
     * keyIdentifier: "U+0008"
    */
    if(e.keyCode === 8 && document.activeElement !== 'text') {
        e.preventDefault();
        alert('Prevent page from going back');
    }
});

8

私の数値制御:

function CheckNumeric(event) {
    var _key = (window.Event) ? event.which : event.keyCode;
    if (_key > 95 && _key < 106) {
        return true;
    }
    else if (_key > 47 && _key < 58) {
        return true;
    }
    else {
        return false;
    }
}

<input type="text" onkeydown="return CheckNumerick(event);" />

それを試してみてください

BackSpaceキーコードは8


6

event.key === "バックスペース"

より新しく、よりクリーン:を使用しますevent.key。これ以上の任意の番号コードはありません!

note.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace") {
        // Do something
    }
});

Mozillaドキュメント

サポートされているブラウザ


1
2018年、これはこれを回避するための最良の方法です!
tfantina

私は、使用したすべての言語のバックスペースにキーコード8を使用しています。ASCIIコードを学ぶ、それらは任意ではありません。
アンドレ・Werlang

3
あなた使っきたからといっ、より良い選択肢がないということではありません。.key現在、ドキュメントで推奨されているオプションです。さらに、特定のキーに対して異なるマッピングを持つさまざまな国際キーボードをサポートします。それらは修正されているという意味では恣意的ではありませんが、コードを読むときのものです
Gibolt

2

代わりに、keyup / keydown / beforeinputイベントのいずれかを使用してください。

この参照に基づいて、keypressは非推奨になり、推奨されなくなりました。

keypressイベントは、文字値を生成するキーが押されたときに発生します。文字値を生成するキーの例には、アルファベット、数字、句読点などがあります。文字値を生成しないキーの例は、Alt、Shift、Ctrl、Metaなどの修飾キーです。

「beforeinput」を使用する場合は、ブラウザの互換性に注意してください。「beforeinput」と他の2つの違いは、「beforeinput」は入力値が変更されようとしているときに発生するため、入力値を変更できない文字では発生しません(たとえば、shift、ctr、alt)。

同じ問題があり、キーアップを使用することで解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.