Trình nghe JavaScript, keypress của Cameron không phát hiện backspace?


141

Tôi đang sử dụng một trình keypressnghe, ví dụ ..

addEventListener("keypress", function(event){

}

Tuy nhiên, điều này dường như không phát hiện ra một backspace xóa văn bản ...

Có một người nghe khác tôi có thể sử dụng để phát hiện điều này?

Câu trả lời:


167

KeyPress sự kiện chỉ được gọi cho nhân vật (in) phím, sự kiện KeyDown được nâng lên cho tất cả bao gồm không in được như Control, Shift, Alt, BackSpacevv

CẬP NHẬT:

Sự kiện nhấn phím được kích hoạt khi nhấn phím và phím đó thường tạo ra giá trị ký tự

Tham khảo .


3
Không hoàn toàn đúng: nhiều phím không in được sẽ phát sinh keypresssự kiện trong nhiều trình duyệt. Xem unixpapa.com/js/key.html
Tim Down

Trong phiên bản hiện tại của Mozilla, backspace và tất cả được phát hiện trong sự kiện nhấn phím.
iniravpatel

70

Hãy thử keydownthay vì keypress.

Các sự kiện bàn phím xảy ra theo thứ tự này: keydown, keyup,keypress

Vấn đề với backspace có lẽ là, trình duyệt sẽ điều hướng trở lại keyupvà do đó trang của bạn sẽ không nhìn thấy keypresssự kiện.


Tôi chưa xem xét các tiêu chuẩn, nhưng thứ tự sự kiện (ít nhất là trong Firefox 37) keydown keypress keyup. unixpapa.com/js/testkey.html
jxmallett

Dường như, đối với các sự kiện chính trong đầu vào, nhân vật không xuất hiện trong trường cho đến khi keyupsự kiện được kích hoạt.
jxmallett

Lần cuối cùng - Trên iOS (8.2), phím xóa lùi chỉ kích hoạt một keydownsự kiện nhưng ký tự không bị xóa khỏi đầu vào cho đến một lúc sau đó.
jxmallett

đây là câu trả lời. thao tác này sẽ xóa phím bấm và nhấn phím Ctrl + V
user1709076

30

Sự keypresskiện này có thể khác nhau trên các trình duyệt.

Tôi đã tạo một Jsfiddle để so sánh các sự kiện bàn phím (sử dụng các phím tắt JQuery) trên Chrome và Firefox. Tùy thuộc vào trình duyệt bạn đang sử dụng một keypresssự kiện sẽ được kích hoạt hay không - backspace sẽ kích hoạt keydown/keypress/keyuptrên Firefox nhưng chỉ keydown/keyuptrên Chrome.

Các sự kiện keyclick đơn được kích hoạt

trên Chrome

  • keydown/keypress/keyupkhi trình duyệt đăng ký một đầu vào bàn phím ( keypressđược kích hoạt)

  • keydown/keyup nếu không có đầu vào bàn phím (được thử nghiệm với alt, shift, backspace, phím mũi tên)

  • keydown Chỉ cho tab?

trên Firefox

  • keydown/keypress/keyupkhi trình duyệt đăng ký đầu vào bàn phím mà còn cho phím lùi, phím mũi tên, tab (vì vậy ở đây keypressđược kích hoạt ngay cả khi không có đầu vào)

  • keydown/keyup cho alt, ca


Điều này không đáng ngạc nhiên vì theo https://api.jquery.com/keypress/ :

Lưu ý: vì sự kiện nhấn phím không được bao phủ bởi bất kỳ thông số kỹ thuật chính thức nào, hành vi thực tế gặp phải khi sử dụng có thể khác nhau giữa các trình duyệt, phiên bản trình duyệt và nền tảng.

Việc sử dụng loại sự kiện nhấn phím không được W3C phản đối ( http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress )

Loại sự kiện nhấn phím được định nghĩa trong thông số kỹ thuật này để tham khảo và đầy đủ, nhưng đặc điểm kỹ thuật này không tán thành việc sử dụng loại sự kiện này. Khi trong bối cảnh chỉnh sửa, tác giả có thể đăng ký vào sự kiện trước đó.


Cuối cùng, để trả lời câu hỏi của bạn, bạn nên sử dụng keyuphoặc keydownđể phát hiện một khoảng lùi trên Firefox và Chrome.


Hãy thử nó ở đây:

$(".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
Câu trả lời tuyệt vời - chủ yếu là để giải thích các cách khác nhau để xử lý backspace trên các trình duyệt
Jivan

2
W3School đã được thực hiện nó: w3schools.com/jsref/...
Tân

1
Đoạn mã rất hữu ích
John Gilmer

17

Một cái gì đó tôi đã viết lên khi bất cứ ai gặp phải vấn đề với những người nhấn backspace trong khi nghĩ rằng họ đang ở trong một trường biểu mẫu

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

Kiểm soát số của tôi:

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);" />

thử nó

Mã khóa BackSpace là 8


6

event.key === "Xóa lùi"

Gần đây và sạch sẽ hơn nhiều: sử dụng event.key. Không còn mã số tùy ý!

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

Tài liệu Mozilla

Trình duyệt được hỗ trợ


1
Năm 2018 đây là cách tốt nhất để đi về điều này!
tfantina

Tôi đã sử dụng mã khóa 8 cho backspace trong mọi ngôn ngữ tôi làm việc cùng. Tìm hiểu mã ASCII, chúng không tùy ý.
André Werlang

3
Chỉ vì bạn đã sử dụng không có nghĩa là không có lựa chọn nào tốt hơn. .keyhiện là tùy chọn được đề xuất bởi các tài liệu. Ngoài ra, nó hỗ trợ các bàn phím quốc tế khác nhau với các ánh xạ khác nhau cho bất kỳ phím nào. Chúng không độc đoán theo nghĩa là chúng đã được sửa, nhưng chúng là khi đọc mã
Gibolt

2

Thay vào đó, hãy sử dụng một trong các sự kiện keyup / keydown / beforeinput.

dựa trên tài liệu tham khảo này , nhấn phím không được dùng nữa và không còn được khuyến nghị.

Sự kiện nhấn phím được kích hoạt khi một phím tạo ra giá trị ký tự được nhấn xuống. Ví dụ về các khóa tạo ra một giá trị ký tự là các phím chữ cái, số và dấu chấm câu. Ví dụ về các khóa không tạo ra giá trị ký tự là các phím bổ trợ như Alt, Shift, Ctrl hoặc Meta.

nếu bạn sử dụng "beforeinput", hãy cẩn thận về tính tương thích của Trình duyệt . sự khác biệt giữa "beforeinput" và hai cái còn lại là "beforeinput" được kích hoạt khi giá trị đầu vào sắp thay đổi, do đó, với các ký tự không thể thay đổi giá trị đầu vào, nó sẽ không được kích hoạt (ví dụ: shift, ctr, alt).

Tôi đã có cùng một vấn đề và bằng cách sử dụng keyup, nó đã được giải quyết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.