原文链接:http://javascript.info/events-change-input,translate with ❤️ by zhangbao.

本章我们讨论伴随数据更新的各种事件。

事件:change

change 事件在元素完成改变之后触发。

对于输入框来说,就是在失去焦点后触发的。

例如,当我们在下面的文本框里输入的时候,不会触发该事件。但当我们移动聚焦到别处时。例如,点击了一个按钮,就会触发 change 事件:

  1. <input type="text" onchange="alert(this.value)">
  2. <input type="button" value="按钮">

对其他元素:selectinput type=checkbox/radio 等则是在选择更改后触发。

事件:input

input 事件是在每次值修改后触发。

例如:

  1. <input type="text" id="input"> oninput: <span id="result"></span>
  2. <script>
  3. input.oninput = function() {
  4. result.innerHTML = input.value;
  5. };
  6. </script>

如果我们想在 <input> 每次修改值后处理数据的话,使用这个事件是最好的选择。

不同于键盘事件的是,它适用于任何值被改变的场景,即使是不涉及键盘操作的情况:比如,用鼠标粘贴或使用语音识别输入文本时,也会触发此事件。

事件:change、input、cut、copy 和 paste - 图1不能阻止 **oninput**``

input 事件是在值改变后触发的。

因此,如果在事件处理器中使用 event.preventDefault() 的话,并不会起作用。

事件:cut、copy 和 paste

这些事件是在剪切/复制/粘贴内容时触发的。

这些事件属于 ClipboardEvent 类,提供了访问复制/粘贴文本的能力。

我们还可以使用 event.preventDefault() 阻止事件的默认行为。

例如,下面代码阻止了所有这些事件的默认行为,并且展示我们尝试剪切/复制/粘贴的内容:

  1. <input type="text" id="input">
  2. <script>
  3. input.oncut = input.oncopy = input.onpaste = function (event) {
  4. console.log(event.type + '-' + event.clipboardData.getData('text/plain'));
  5. return false;
  6. };
  7. </script>

从技术上讲,我们可以复制/粘贴所有东西。例如,我们可以在OS文件管理器中复制,然后粘贴它。

规范中提供了一组可以处理不同的数据类型,读/写到剪贴板的方法。

需要注意的是,剪贴板是一个系统级别的“全局”事物。大多数浏览器只允许在特定的操作范围内对剪贴板进行读/写访问。此外,除了 Firefox 之外的其他浏览器禁止创建“自定义”剪贴板事件。

总结

数据改变时触发的事件:

事件 描述 特性
change 当值改变后 对于输入框,是在元素失焦时触发的
input 输入框内容每次发生修改时 change 事件不同的是,会即刻触发
cut/copy/paste 发生了剪切/复制/粘贴行为 这些行为可被阻止。event.clipboardData 属性赋予了读/写剪切板的能力

(完)