У меня есть две функции. При нажатии кнопки функции выполняются корректно, но при нажатии кнопки сброса нет. Какое правильное число для ключа эвакуации?
$(document).keypress(function(e) {
if (e.which == 13) $('.save').click(); // enter (works as expected)
if (e.which == 27) $('.cancel').click(); // esc (does not work)
});
Попробуйте событие keyup:
$(document).keyup(function(e) {
if (e.keyCode === 13) $('.save').click(); // enter
if (e.keyCode === 27) $('.cancel').click(); // esc
});
Вместо того, чтобы фиксировать значения кода в вашей функции, рассмотрите использование именованных констант, чтобы лучше передать свой смысл:
var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;
$(document).keyup(function(e) {
if (e.keyCode == KEYCODE_ENTER) $('.save').click();
if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});
Некоторые браузеры (например, FireFox, unsure of others) определяют глобальный объект KeyEvent
, который предоставляет вам эти типы констант. Этот вопрос SO показывает хороший способ определения этого объекта в других браузерах.
(Ответ извлечен из моего предыдущего комментария)
Вам нужно использовать keyup
, а не keypress
. например:.
$(document).keyup(function(e) {
if (e.which == 13) $('.save').click(); // enter
if (e.which == 27) $('.cancel').click(); // esc
});
keypress
, похоже, не обрабатывается последовательно между браузерами (попробуйте демонстрацию в http://api.jquery.com/keypress в IE против Chrome vs Firefox. Иногда keypress
не регистрируется, а значения для "which" и "keyCode" меняются), тогда как keyup
является непротиворечивым.
Так как было некоторое обсуждение e.which
vs e.keyCode
: Обратите внимание, что e.which
является нормализованным значением jquery и является рекомендуемым для использования:
Свойство event.which нормализует event.keyCode и event.charCode. Рекомендуется следить за событием. Для ввода клавиатуры.
keypress
при выходе, делают это правильно. keypress
предназначен для запуска только тогда, когда ключ производит символ, тогда как keyup
срабатывает всегда. developer.mozilla.org/en-US/docs/Web/Events/keypress
Чтобы найти код ключа для любого ключа, используйте эту простую функцию:
document.onkeydown = function(evt) {
console.log(evt.keyCode);
}
27
- это код управляющего ключа.:)
Попробуйте jEscape плагин (скачать с Google Drive)
$(document).escape(function() {
alert('ESC button pressed');
});
или получить ключевой код для кросс-браузера
var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');
возможно, вы можете использовать переключатель
var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
case 27:
alert('ESC');
break;
case 13:
alert('ENTER');
break;
}
Лучше всего
$(document).keyup(function(e) {
if (e.which === 13) $('.save').click(); // enter
if (e.which === 27) $('.cancel').click(); // esc
/* OPTIONAL: Only if you want other elements to ignore event */
e.preventDefault();
e.stopPropagation();
});
Резюме
which
является более предпочтительным, чем keyCode
, потому что он нормализуетсяkeyup
является более предпочтительным, чем keydown
, поскольку при нажатии на него может появляться несколько раз, если пользователь держит его нажатым.keypress
, если вы не хотите захватить фактические символы.Интересно, что Bootstrap использует keydown и keyCode в своем раскрывающемся компоненте (начиная с 3.0.2)! Я думаю, что это, вероятно, плохой выбор.
Связанный фрагмент документа JQuery
В то время как браузеры используют разные свойства для хранения этой информации, jQuery нормализует. чтобы вы могли надежно использовать его для извлечения key code. Эта код соответствует клавише на клавиатуре, включая коды для специальных таких как стрелки. Чтобы поймать фактический ввод текста,.keypress() может быть лучшим выбором.
Другой интересный объект: JavaScript Keypress Library
Я пытаюсь сделать то же самое, и это вызывало у меня дерьмо. В firefox кажется, что если вы пытаетесь сделать что-то, когда нажата клавиша эвакуации, она продолжает обрабатывать escape-ключ, который затем отменяет все, что вы пытаетесь сделать. Предупреждение работает нормально. Но в моем случае я хотел вернуться в историю, которая не сработала. Наконец выяснилось, что мне пришлось заставить распространение события остановиться, как показано ниже...
if (keyCode == 27)
{
history.back();
if (window.event)
{
// IE works fine anyways so this isn't really needed
e.cancelBubble = true;
e.returnValue = false;
}
else if (e.stopPropagation)
{
// In firefox, this is what keeps the escape key from canceling the history.back()
e.stopPropagation();
e.preventDefault();
}
return (false);
}
Ваш код работает отлично. Скорее всего, это окно не сфокусировано. Я использую аналогичную функцию для закрытия полей iframe и т.д.
$(document).ready(function(){
// Set focus
setTimeout('window.focus()',1000);
});
$(document).keypress(function(e) {
// Enable esc
if (e.keyCode == 27) {
parent.document.getElementById('iframediv').style.display='none';
parent.document.getElementById('iframe').src='/views/view.empty.black.html';
}
});
Чтобы получить шестнадцатеричный код для всех символов: http://asciitable.com/
Объяснить, где нет других ответов; проблема заключается в использовании keypress
.
Возможно, событие просто неверно названо, но keypress
определено для запуска, когда when an actual
character
is being inserted
. То есть текст.
В то время как вы хотите keydown
/keyup
, который срабатывает всякий раз (до или после, соответственно) the user depresses a
key
. То есть эти вещи на клавиатуре.
Разница появляется здесь, потому что esc
является управляющим символом (буквально "непечатаемый символ" ) и поэтому не пишет никаких текст, поэтому даже не стрелять keypress
. enter
является странным, потому что, хотя вы используете его как управляющий символ (т.е. для управления пользовательским интерфейсом), он все равно вставляет символ новой строки, который срабатывает keypress
.
Источник: quirksmode
Я знаю, что этот вопрос задает вопрос о jquery, но для тех людей, которые используют jqueryui, существуют константы для многих ключевых кодов:
$.ui.keyCode.ESCAPE
Я всегда использовал keyup и e.which, чтобы поймать escape-ключ.
Введена надежная библиотека Javascript для ввода ввода клавиатуры и комбинаций клавиш. У него нет зависимостей.
http://jaywcjlove.github.io/hotkeys/
hotkeys('enter,esc', function(event,handler){
switch(handler.key){
case "enter":$('.save').click();break;
case "esc":$('.cancel').click();break;
}
});
Горячие клавиши понимают следующие модификаторы: ⇧, shift option ⌥ alt ctrl control command и ⌘.
Для ярлыков можно использовать следующие специальные клавиши: backspace tab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, delete и f1 через f19.
Просто отправьте обновленный ответ, чем e.keyCode
считается DEPRECATED на MDN.
Скорее вы должны выбрать e.key
, который поддерживает чистые имена для всего. Вот соответствующая копия макаронных изделий
window.addEventListener("keydown", function (event) {
if (event.defaultPrevented) {
return; // Do nothing if the event was already processed
}
switch (event.key) {
case "ArrowDown":
// Do something for "down arrow" key press.
break;
case "ArrowUp":
// Do something for "up arrow" key press.
break;
case "ArrowLeft":
// Do something for "left arrow" key press.
break;
case "ArrowRight":
// Do something for "right arrow" key press.
break;
case "Enter":
// Do something for "enter" or "return" key press.
break;
case "Escape":
// Do something for "esc" key press.
break;
default:
return; // Quit when this doesn't handle the key event.
}
// Cancel the default action to avoid it being handled twice
event.preventDefault();
}, true);