JavaScript dinleyicisi, “keypress” geri almayı algılamıyor mu?


141

Bir keypressdinleyici kullanıyorum .

addEventListener("keypress", function(event){

}

Ancak bu, metni silen bir geri almayı algılamıyor gibi görünüyor ...

Bunu tespit etmek için kullanabileceğim farklı bir dinleyici var mı?

Yanıtlar:


167

KeyPress olayı sadece karakter için çağrılır (yazdırılabilir) tuşları, KeyDown olayı bütün gibi yazdırılamaz dahil olmak üzere yükseltilir Control, Shift, Alt,BackSpace , vb

GÜNCELLEME:

Bir tuşa basıldığında tuşa basma olayı tetiklenir ve bu tuş normalde bir karakter değeri üretir

Referans .


3
Kesinlikle doğru değil: yazdırılamayan birçok tuş keypressbirçok tarayıcıda olayları tetikler. Bkz. Unixpapa.com/js/key.html
Tim Down

Mozilla'nın geçerli sürümünde, backspace ve tümü keypress olayında algılanır.
iniravpatel

70

keydownBunun yerine deneyin keypress.

Klavye olayları şu sırada oluşur: keydown, keyup,keypress

Backspace ile ilgili sorun muhtemelen tarayıcının tekrar gezineceği keyupve sayfanızın keypressetkinliği görmeyecek olmasıdır .


Standartlara bakmadım, ancak olay sırası (en azından Firefox 37'de) gibi görünüyor keydown keypress keyup. unixpapa.com/js/testkey.html
jxmallett

Ayrıca, girdilerdeki önemli olaylar için, keyupolay tetikleninceye kadar karakterin alanda görünmediği görülmektedir .
jxmallett

Sonuncusu - iOS'ta (8.2) geri silme tuşu yalnızca bir keydownolayı tetikler, ancak karakter bundan sonraya kadar girişten kaldırılmaz.
jxmallett

işte cevap. bu tuşa
basmayı

30

keypressOlay tarayıcılarda farklı olabilir.

Chrome ve Firefox'ta klavye olaylarını (JQuery kısayollarını kullanarak) karşılaştırmak için bir Jsfiddle oluşturdum . Kullandığınız tarayıcıya bağlı olarak bir keypressetkinlik tetiklenir veya tetiklenmez - geri tuşu keydown/keypress/keyupFirefox'ta tetiklenir ancak yalnızca keydown/keyupChrome'da tetiklenir .

Tek tuşla tıklama olayları tetiklendi

Chrome'da

  • keydown/keypress/keyuptarayıcı bir klavye girişini kaydettiğinde ( keypresstetiklenir)

  • keydown/keyup klavye girişi yoksa (alt, shift, backspace, ok tuşlarıyla test edilmiştir)

  • keydown sadece sekme için mi?

Firefox'ta

  • keydown/keypress/keyuptarayıcı bir klavye girişi kaydettiğinde, aynı zamanda geri tuşu, ok tuşları, sekme için de ( keypressgiriş yapılmadan bile burada tetiklenir)

  • keydown/keyup alt için, shift


Bu şaşırtıcı olmamalı çünkü https://api.jquery.com/keypress/ adresine göre :

Not: keypress olayı herhangi bir resmi spesifikasyon kapsamında olmadığından, bunu kullanırken karşılaşılan gerçek davranış tarayıcılar, tarayıcı sürümleri ve platformlar arasında farklılık gösterebilir.

Tuşa basma olayı türünün kullanımı W3C tarafından kullanımdan kaldırılmıştır ( http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress )

Tuşa basma olay türü, bu belirtimde başvuru ve eksiksizlik için tanımlanmıştır, ancak bu belirtim, bu olay türünün kullanımını reddetmektedir. Bağlamları düzenlerken, yazarlar bunun yerine beforeinput olayına abone olabilirler.


Son olarak, sorunuzu cevaplamak için Firefox ve Chrome'da bir geri almayı algılamanız keyupveya kullanmanız gerekir keydown.


Burada deneyin:

$(".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
Müthiş cevap - çoğunlukla tarayıcılar arasında geri almanın farklı yollarının açıklaması için
Jivan

2
W3School zaten yapıldı: w3schools.com/jsref/…
Tân

1
Kod Parçacığı çok yardımcı oldu
John Gilmer

17

Yazdığım bir şey herkesin bir form alanında olduklarını düşünürken geri tepen isabet eden insanlarla ilgili bir sorunla karşılaşırsa

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

Sayısal kontrolüm:

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

dene

BackSpace anahtar kodu 8


6

event.key === "Geri al"

Daha yeni ve daha temiz: kullanın event.key. Artık keyfi sayı kodları yok!

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

Mozilla Belgeleri

Desteklenen Tarayıcılar


1
2018'de bu konuda en iyi yol!
tfantina

Çalıştığım her dilde backspace için anahtar kodu 8 kullanıyorum. ASCII kodlarını öğrenin, keyfi değildirler.
André Werlang

3
Sadece çünkü var daha iyi bir seçenek olmadığı anlamına gelmez kullanıyoruz. .keyşu anda dokümanlar tarafından önerilen seçenektir. Ayrıca, herhangi bir tuş için farklı eşlemeler içeren çeşitli uluslararası klavyeleri destekler. Onlar değil keyfi düzeltilinceye anlamında, ama kod okurken bunlar
Gibolt

2

Bunun yerine keyup / keydown / beforeinput olaylarından birini kullanın.

bu referansa dayanarak , tuşa basma kullanımdan kaldırılmıştır ve artık önerilmemektedir.

Karakter değeri üreten bir tuşa basıldığında keypress olayı tetiklenir. Karakter değeri üreten tuşlara örnek olarak alfabetik, sayısal ve noktalama işaretleri verilebilir. Karakter değeri üretmeyen anahtarlara örnek olarak Alt, Shift, Ctrl veya Meta gibi değiştirici anahtarlar verilebilir.

"beforeinput" kullanıyorsanız Tarayıcı uyumluluğuna dikkat edin . "beforeinput" ile diğer ikisi arasındaki fark, giriş değeri değişmek üzereyken "beforeinput" komutunun tetiklenmesidir, bu nedenle giriş değerini değiştiremeyen karakterlerde tetiklenmez (örn. shift, ctr, alt).

Aynı problemi yaşadım ve keyup kullanarak çözüldü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.