В чем разница между этими тремя событиями? Погуглив, я обнаружил, что:
onKeyDown
Событие срабатывает , когда пользователь нажимает клавишу.onKeyUp
Событие срабатывает , когда пользователь отпускает клавишу.onKeyPress
Событие срабатывает , когда пресса и пользователь отпускает ключ ( сonKeyDown
последующимonKeyUp
).
Я понимаю первые два, но не onKeyPress
так onKeyUp
ли? Можно ли отпустить клавишу ( onKeyUp
), не нажимая ее ( onKeyDown
)?
Это немного сбивает с толку, может кто-нибудь прояснить это для меня?
javascript
dom
dom-events
instantsetsuna
источник
источник
Ответы:
Проверьте здесь архивную ссылку, первоначально использованную в этом ответе.
По этой ссылке:
источник
KeyPress
,KeyUp
ИKeyDown
аналогичны, соответственно:Click
,MouseUp,
иMouseDown
.Down
случается первымPress
происходит второй (при вводе текста)Up
происходит в последний раз (когда ввод текста завершен).Исключением является webkit , в котором есть дополнительное событие:
Ниже приведен фрагмент, который вы можете использовать, чтобы увидеть, когда события будут запущены:
источник
keypress
иkeydown
события в буквальном смысле получить присваивается такое же.timeStamp
значение, которое с точностью до интервалами 5 микросекунд, но это не моя точка в любом случае. Яclick
хочу сказать, что событие не сработает до тех пор, пока вы не отпустите кнопку мыши, поэтому если вы говорите, чтоkeypress
эта версия клавиатурыclick
делает его звучащим такkeypress
же, оно не сработает, пока вы не отпустите клавишу. На самом деле это не так: он срабатывает, когда клавиша нажата, так же, как иkeydown
она. Такkeypress
что на самом деле совсем не аналогичноclick
.keypress
,keyup
иkeydown
аналогичныclick
,mouseup
иmousedown
. Для меня естественная интерпретация этого состоит в том, чтоkeypress
огонь срабатывает в одно и то же время, что иkeyup
(так же, какclick
иmouseup
). Что вы имели в виду, если не это?Большинство ответов здесь сосредоточены больше на теории, чем на практических вопросах, и есть некоторые большие различия между значениями полей ввода
keyup
иkeypress
относительно них, по крайней мере в Firefox (протестировано в 43).Если пользователь вводит
1
пустой элемент ввода:Значением входного элемента будет пустая строка (старое значение) внутри
keypress
обработчикаЗначение входного элемента будет
1
(новое значение) внутриkeyup
обработчика.Это очень важно, если вы делаете что-то, что зависит от знания нового значения после ввода, а не текущего значения, такого как встроенная проверка или автоматическое табулирование.
Сценарий:
12345
в элемент ввода.12345
.A
.Когда
keypress
событие начинается после ввода буквыA
, текстовое поле теперь содержит только буквуA
.Но:
12345
.5
Таким образом, кажется, что браузер (Firefox 43) стирает выбор пользователя, затем запускает
keypress
событие, затем обновляет содержимое полей, а затем запускаетkeyup
.источник
onkeydown
вызывается , когда клавиша нажата (например , в ярлыках, например, вCtrl+A
,Ctrl
удерживается «нажата».onkeyup
срабатывает при отпускании ключа (включая ключи модификатора / etc)onkeypress
срабатывает как комбинацияonkeydown
иonkeyup
, или в зависимости от повторения клавиатуры (когдаonkeyup
не срабатывает). (Это повторяющееся поведение я не проверял. Если вы делаете тест, добавьте комментарий!)textInput
(только webkit) запускается, когда вводится какой-либо текст (например,Shift+A
он вводит заглавную букву «A», ноCtrl+A
выбирает текст и не вводит текстовый ввод. В этом случае запускаются все остальные события)источник
Во-первых, они имеют разное значение: они стреляют
Во-вторых, некоторые ключи запускают некоторые из этих событий и не запускают другие . Например,
Кроме того, вы должны иметь в виду, что
event.keyCode
(иevent.which
) обычно имеют одинаковые значения для KeyDown и KeyUp, но разные для KeyPress. Попробуйте игровую площадку, которую я создал. Кстати, я заметил довольно странную причину: в Chrome, когда я нажимаю ctrl+, aаinput
/textarea
пусто, KeyPress срабатывает сevent.keyCode
(иevent.which
), равным1
! (когда вход не пустой, он вообще не срабатывает).Наконец, есть некоторые прагматики :
textarea
, и KeyPress, и KeyDown срабатывают несколько раз (Chrome 71), я бы использовал KeyDown, если мне нужно событие, которое запускается несколько раз, и KeyUp для отпускания одного ключа.input
s иtextarea
s в разных браузерах (в основном из-за потери фокуса)Я использовал все 3 в своем проекте, но, к сожалению, возможно, забыл некоторые прагматики. (чтобы отметить: есть также
input
иchange
события)источник
Эта статья Яна Вольтера - лучшая статья, которую я когда-либо встречал, вы можете найти архивную копию здесь, если ссылка не работает.
Он хорошо объясняет все ключевые события браузера,
источник
Кажется, что onkeypress и onkeydown делают одно и то же (с небольшой разницей в сочетаниях клавиш, уже упомянутых выше).
Вы можете попробовать это:
И вы увидите, что события onkeypress и onkeydown запускаются при нажатии клавиши, а не при нажатии клавиши.
Разница в том, что событие вызывается не один, а многократно (пока вы удерживаете нажатой клавишу). Помните об этом и обращайтесь с ними соответствующим образом.
источник
keypress
события, но всегда вызывают akeydown
.Событие onkeypress работает для всех клавиш, кроме ALT, CTRL, SHIFT, ESC во всех браузерах, где событие onkeydown работает для всех клавиш. Означает событие onkeydown захватывает все ключи.
источник
Просто хотел поделиться любопытством
при использовании события onkeydown для активации метода JS код для этого события НЕ совпадает с кодом, полученным с помощью onkeypress!
Например, цифровые клавиши вернут те же коды, что и цифровые клавиши над буквенными клавишами при использовании onkeypress, но НЕ при использовании onkeydown!
Мне понадобилось несколько секунд, чтобы понять, почему мой скрипт, который проверял определенные коды, не работал при использовании onkeydown!
Демонстрация: https://www.w3schools.com/code/tryit.asp?filename=FMMBXKZLP1MK
и да. Я знаю, что определения методов разные ... но очень запутанно то, что в обоих методах результат события извлекается с использованием event.keyCode ... но они не возвращают одно и то же значение ... не очень декларативная реализация.
источник
0123456789
)По сути, эти события действуют по-разному в разных типах и версиях браузера, я создал небольшой тест jsBin, и вы можете проверить консоль, чтобы узнать, как эти события ведут себя в вашей целевой среде, надеюсь, это поможет. http://jsbin.com/zipivadu/10/edit
источник
Обновленный ответ:
KeyDown
Нажатие клавиши
KeyUp
Это поведение в обоих
addEventListener
иjQuery
.https://jsbin.com/vebaholamu/1/edit?js,console,output <- попробовать пример
(ответ был отредактирован с правильным ответом, скриншот и пример)
источник
Несколько практических фактов, которые могут быть полезны, чтобы решить, какое событие обрабатывать (запустите скрипт ниже и сфокусируйтесь на поле ввода):
Нажатие кнопки:
не вводящие / печатающие ключи (например Shift, Ctrl) не будут вызывать
keypress
. Нажмите Ctrlи отпустите:ключи от клавиатур, которые применяют преобразования символов к другим символам, могут привести к « мертвым» и дублирующим «ключам» (например ~, ´)
keydown
. Нажмите ´и отпустите, чтобы отобразить двойное´´
:Кроме того, ввод без ввода (например, ранжированный
<input type="range">
) будет по-прежнему запускать все события нажатия клавиш, нажатия клавиш и нажатия клавиш в соответствии с нажатыми клавишами.источник