Слухач JavaScript, "натискання клавіші" не виявляє зворотній простір?


141

Я використовую keypressслухач, наприклад.

addEventListener("keypress", function(event){

}

Однак, схоже, це не виявляє зворотного простору, який стирає текст ...

Чи є інший слухач, який я можу використовувати для виявлення цього?

Відповіді:


167

KeyPress подія викликається тільки для символу (версія для друку) ключі, KeyDown події виникають в тому числі для всіх недрукованих , таких як Control, Shift, Alt, BackSpaceі т.д.

ОНОВЛЕННЯ:

Подія натискання клавіші запускається при натисканні клавіші, яка зазвичай видає значення символу

Довідково .


3
Не зовсім вірно: багато недрукованих клавіш викликають keypressподії у багатьох браузерах. Дивіться unixpapa.com/js/key.html
Tim Down

У поточній версії Mozilla зворотний простір і все це виявляється при натисканні клавіші.
iniravpatel

70

Спробуйте keydownзамість цього keypress.

Події клавіатури відбуваються в наступному порядку: keydown, keyup,keypress

Мабуть, проблема із зворотним простором полягає в тому, що браузер повернеться назад keyupі, отже, ваша сторінка не побачить keypressподії.


Я не розглядав стандарти, але порядок проведення заходів (як мінімум у Firefox 37), здається, є keydown keypress keyup. unixpapa.com/js/testkey.html
jxmallett

Також здається, що для ключових подій у вводах персонаж не з'являється в полі, поки keyupподія не буде запущена.
jxmallett

Останнє - на iOS (8.2) клавіша зворотної області запускає лише keydownподію, але персонаж не видаляється з входу лише десь після цього.
jxmallett

це відповідь. це захоплює видалення натискання клавіш та натискання клавіш Ctrl + V
user1709076

30

keypressПодія може відрізнятися в різних браузерах.

Я створив Jsfiddle для порівняння подій на клавіатурі (за допомогою ярликів JQuery) на Chrome і Firefox. Залежно від веб-переглядача, який ви використовуєте, keypressподія буде спрацьовувати чи ні - зворотний простір запуститься keydown/keypress/keyupна Firefox, але лише keydown/keyupв Chrome.

Запускаються поодинокі події клавіші

на Chrome

  • keydown/keypress/keyupколи браузер реєструє вхід клавіатури ( keypressспрацьовує)

  • keydown/keyup якщо немає клавіатурного вводу (перевірено клавішами Alt, Shift, Backspace, стрілками)

  • keydown лише для вкладки?

на Firefox

  • keydown/keypress/keyupколи браузер реєструє вхід на клавіатурі, але також і для зворотної області, клавіш зі стрілками, вкладки (так що тут keypressзапускається навіть без введення)

  • keydown/keyup для alt, shift


Це не повинно дивувати, оскільки згідно з https://api.jquery.com/keypress/ :

Примітка: оскільки подія натискання клавіші не охоплюється жодними офіційними специфікаціями, реальна поведінка, що виникає при її використанні, може відрізнятися в браузерах, версіях браузера та платформах.

Використання типу події натискання клавіш припинено W3C ( http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress )

Тип події натискання клавіші визначений у цій специфікації для довідки та повноти, але ця специфікація знижує використання цього типу події. Під час редагування контекстів автори можуть замість цього підписатись на події раніше.


Нарешті, щоб відповісти на ваше запитання, слід використовувати 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 / ...
TAn

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, вони не довільні.
Андре Верланг

3
Просто тому , що ви вже використовували не означає , що це не найкращий варіант. .keyна даний момент рекомендована документація. Крім того, він підтримує різні міжнародні клавіатури з різними відображеннями для будь-якого клавіші. Вони не є довільними в тому сенсі, що їх фіксують, але вони є при читанні коду
Gibolt

2

Замість цього використовуйте одну з подій клавіатури / клавіші / перед введенням.

на основі цієї посилання натискання клавіш застаріле і більше не рекомендується.

Подія натискання клавіші запускається, коли натискається клавіша, яка створює значення символу. Прикладами клавіш, які створюють символьне значення, є алфавітні, числові та пунктуаційні ключі. Прикладами клавіш, які не видають значення символу, є ключі-модифікатори, такі як Alt, Shift, Ctrl або Meta.

якщо ви використовуєте "раніше", будьте уважні щодо сумісності браузера . Різниця між "beforeinput" та іншими двома полягає в тому, що "beforeinput" запускається, коли вхідне значення майже зміниться, тому для символів, які не можуть змінити вхідне значення, воно не запускається (наприклад, shift, ctr, alt).

У мене була така ж проблема, і за допомогою клавіатури вона була вирішена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.