javascript - 对于 JavaScript 自动完成搜索框,我们必须使用 "input"事件处理程序吗?

标签 javascript javascript-events

我试图区分 keydown 的不同用途, keypress , keyup , input , change JavaScript 中的事件。

如果是JavaScript自动补全搜索框,是不是一定要用input事件处理程序?

原因是:

  1. change在用户按下 Enter 键或离开该输入框(通过 Tab 键或在输入框外单击)之前,不会调用事件处理程序,因此 change当用户在输入框中多输入一个字符时,事件可能不能满足提示的目的。

  2. 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

    当数据被粘贴到元素中时,这个方便的事件会触发。

修饰键

请注意 keydownkeypresskeyup 带有关于属性 ctrlKeyshiftKey 中修饰键 CtrlShiftAlt 的信息和 altKey 分别。

案例

以下是您需要考虑的案例列表:

  • 使用键盘输入(包括按住一个键)

    触发器:keydownkeypressinputkeyup

  • 删除输入(Backspace/Delete)

    触发器:keydowninputkeyup

  • 使用 Ctrl+V 粘贴

    触发器:keydownpasteinputkeyup

  • 使用鼠标粘贴

    触发器:pasteinput

  • 从自动完成中选择一个项目(/)

    触发器:keydownkeyup

实现

鉴于上述情况,您可以实现自动完成框处理输入的所有更改的 input 事件,然后 keydown 事件处理向上和向下。这确实会很好地分离所有内容并产生一些非常干净的代码。

如果你想支持 IE8,你需要把除了粘贴之外的所有东西都扔到 keydown 事件中,然后处理 pastepaste 事件现在得到了相当广泛的支持,并且已经在 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/

相关文章:

Javascript/jquery 从另一个页面加载特定的 div

Javascript:将四舍五入的数字格式化为 N 位小数

javascript - 试图在我的页面上加载 Bootstrap 日历。获取 Uncaught Error

javascript - 如何在 JavaScript 中禁用 ESC 键的功能?

javascript - 如何动态增加输入控件...??? (javascript)

c# - &lt;script&gt;...&lt;/script&gt; 在转发器控制代码中未显示在页面呈现的源代码中

javascript - 延迟Javascript中的默认事件

javascript - 在普通 javascript 中不显眼的加载的最佳方式

javascript-events - 选中了多少个复选框

javascript - Codecademy 帮助,变量不起作用