JQuery: как отфильтровать не символьные клавиши по событию нажатия клавиши? - PullRequest
37 голосов
/ 18 февраля 2010

Я пытался найти, но не знал, какие условия искать.

Я использую jQuery и хотел бы использовать событие нажатия клавиши в текстовом поле, но запретить все непечатаемые символы (т. Е. Ввод , ESC , клавиши со стрелками, backspace , tab , ctrl , insert , F1 - F12 и т.д.) запуск события.

Есть ли простой способ определить, пригоден ли он для печати?

Ответы [ 4 ]

28 голосов
/ 18 февраля 2010
<script>
    $("input").keypress(function (e) {
        if (e.which !== 0 &&
            !e.ctrlKey && !e.metaKey && !e.altKey) {
            alert(String.fromCharCode(e.which));
        }
    });
</script>

Кажется, отлично работает с jQuery 1.4.2, FF, IE, Chrome.

Чтобы вникнуть в беспорядок, связанный с обработкой событий клавиатуры JS, смотрите: JavaScript Madness: События клавиатуры


Обновлено для фильтрации комбинаций клавиш Ctrl, Meta и Alt согласно Комментарий Даниэля .

27 голосов
/ 26 ноября 2013

Выбранный ответ на этот вопрос не полный. Он не обрабатывает случай, когда нажимается символьная клавиша в сочетании с клавишей-модификатором (например, CTRL - A ).

Попробуйте, например, набрать CTRL - A , используя firefox со следующим кодом. Текущий ответ будет рассматривать его как символ:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/>

JavaScript:

$("input").keypress(function (e) {
    if (e.which !== 0) {
        alert(String.fromCharCode(e.which));
    }
});

http://jsfiddle.net/4jx7v/

Примечание. При использовании некоторых браузеров (таких как Chrome) предупреждение не будет запускаться, поскольку они не запускают событие нажатия клавиш для несимвольных вводов.

Лучшее решение может быть:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/>

JavaScript:

$("input").keypress(function (e) {
    if (e.which !== 0 &&
        !e.ctrlKey && !e.metaKey && !e.altKey
    ) {
        alert(String.fromCharCode(e.which));
    }
});

http://jsfiddle.net/hY5f4/

В этом случае предупреждение срабатывает только при нажатии A , а не CTRL - A для всех браузеров.

0 голосов
/ 21 декабря 2016

Проверка на комбинации клавиш не будет лучшим решением во всех случаях. Например, если вы используете комбинацию клавиш для ввода символа, это заблокирует событие onkeypress, а это не должно быть.

Попробуйте это здесь, и вы увидите, что оно не будет работать: http://jsfiddle.net/4jx7v/

(На Mac попробуйте alt + буква, а в Windows - alt + серия цифровых клавиш.)

Альтернативой этому было бы просто проверить, изменилось ли входное значение по сравнению с предыдущим, таким образом, вы точно знаете, что что-то было напечатано.

JavaScript:

var previousValue;
$("input").keypress(function (e) {
    if (previousValue != $(this).val()) {
        alert('Something has been typed.');
    }
});
0 голосов
/ 18 февраля 2010

Вы можете использовать такие регулярные выражения

$('something').keypress(function(e) {
    if(e.match(YourRegularExpressionHere)) {
        //do something
    } 
});

Это будет что-то делать, только если оно соответствует регулярному выражению.

Посмотрите на регулярные выражения. http://www.regular -expressions.info / javascript.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...