我试图区分 keydown
的不同用途, keypress
, keyup
, input
, change
JavaScript 中的事件。
如果是JavaScript自动补全搜索框,是不是一定要用input
事件处理程序?
原因是:
change
在用户按下 Enter 键或离开该输入框(通过 Tab 键或在输入框外单击)之前,不会调用事件处理程序,因此change
当用户在输入框中多输入一个字符时,事件可能不能满足提示的目的。keydown
事件处理程序可用于将击键“添加”到搜索词中,但对于 CTRL-v 或 CMD-v(在 Mac 上)粘贴它,我们无法真正获得keyCode
。如果我们粘贴一个单词,如hello
进入搜索框——因为只有一个按键用于 CTRL 和一个按键用于v
, 而不是hello
-- 但是我们可以使用输入框的value
属性以获取值——但是,如果用户使用鼠标右键单击并选择“粘贴”以将文本添加到框中会怎样——在这种情况下,我们应该还是可以使用鼠标事件处理程序来查看value
属性?处理这么低水平的键盘和鼠标实在是太乱了。
所以 input
事件处理程序似乎恰好符合确切的目的,因为任何值更改,input
将调用事件处理程序。这就是为什么 input
事件处理程序可能很重要且很有用。
我们仍然需要 keydown
事件处理程序,因为如果用户按下向下箭头键在可能的项目列表中向下移动怎么办? (可能还有 ESC 使自动完成建议框消失)。在这些情况下,input
事件处理程序和 change
不会调用事件处理程序,并且 keydown
事件将对这些情况很有用。
以上概念是否正确,主要是为了理解input
事件?
(一个 jsfiddle,用于了解调用的事件处理程序:http://jsfiddle.net/jYsjs/)
最佳答案
你基本上是对的,这里详细介绍了事件和潜在的输入案例。
JavaScript 事件
这是触发不同事件的时间:
change
如果
blur
的值已更改,则会在触发<input>
事件时调用此方法。换句话说,当输入失去焦点并且值与原来不同时,它将触发。input
input
事件基本上是您要查找的所有内容,它会捕获任何输入更改时的事件,并且很可能是由于开发监视每次击键的东西时令人头疼的问题。输入事件甚至设法捕获鼠标粘贴内容的情况。不幸的是,
input
event 相对较新,仅适用于现代浏览器 (IE9+)。keydown
keydown
事件非常简单,它在用户按下按键时触发。keypress
keypress
事件应该是 represent a character being typed 。因此,它不会捕获退格键或删除,这会立即将其关闭以用于keydown
。keyup
很像
keydown
,它会在用户释放按键时触发。paste
当数据被粘贴到元素中时,这个方便的事件会触发。
修饰键
请注意 keydown
、 keypress
和 keyup
带有关于属性 ctrlKey
、 shiftKey
中修饰键 Ctrl、Shift 和 Alt 的信息和 altKey
分别。
案例
以下是您需要考虑的案例列表:
使用键盘输入(包括按住一个键)
触发器:
keydown
、keypress
、input
、keyup
删除输入(Backspace/Delete)
触发器:
keydown
、input
、keyup
使用 Ctrl+V 粘贴
触发器:
keydown
、paste
、input
、keyup
使用鼠标粘贴
触发器:
paste
、input
从自动完成中选择一个项目(↑/↓)
触发器:
keydown
、keyup
实现
鉴于上述情况,您可以实现自动完成框处理输入的所有更改的 input
事件,然后 keydown
事件处理向上和向下。这确实会很好地分离所有内容并产生一些非常干净的代码。
如果你想支持 IE8,你需要把除了粘贴之外的所有东西都扔到 keydown
事件中,然后处理 paste
。 paste
事件现在得到了相当广泛的支持,并且已经在 IE since v5.5 中)。
试验事件
Here is the jsFiddle 我用来测试事件,你可能会发现它很有用。它显示了关于每个事件的更多信息:
function logEvent(e) {
console.log(e.type +
"\n this.value = '" + this.value + "'" +
(e.keyCode ? "\n e.keyCode = '" + e.keyCode + "'" : "") +
(e.keyCode ? "\n char = '" + String.fromCharCode(e.keyCode) + "'" : ""));
console.log(e);
}
引用资料
关于javascript - 对于 JavaScript 自动完成搜索框,我们必须使用 "input"事件处理程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727324/