JS 事件: Composition Input 组合输入事件(中文输入事件监听)

news/2024/7/19 9:50:44 标签: js, event, web, input, listener
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

JS 事件: Composition Input 组合输入事件(中文输入事件监听)

文章目录

  • JS 事件: Composition Input 组合输入事件(中文输入事件监听)
  • 前言
  • 正文
    • 组合输入事件:compositionstart、compositionupdate、compositionend
    • 输入阶段
    • 代码示例
      • 1. 非受控组件
      • 2. 受控组件
  • 结语
  • 其他资源
    • 参考连接
    • 完整代码示例

前言

今天跟大家分享一个比较有趣的小知识。我们都知道 html 中监听 <input> 标签的输入相关事件有 inputchange 等,其中在 React 中我们又通常都使用 onChange 来监听输入事件。

今天要介绍的是与中文输入类似的组合输入事件监听

正文

组合输入事件:compositionstart、compositionupdate、compositionend

废话不多说,主角直接上场。

<input> 标签下我们有三个事件名称可以监听组合输入的事件,不论是简体中文或是繁体中文或是其他任何输入会被替换成最终输入的文字的语言都一样

  • compositionstart:组合输入开始
  • compositionupdate:组合输入更新
  • compositionend:组合输入结束

输入阶段

接下来我们明确一下组合输入的阶段

  1. 开始阶段:处于特别的输入法并敲下第一个字符,这时候就会触发 compositionstart 事件
  2. 更新阶段:在组合输入的状态下继续输入更多字符,这时候触发的是 compositionupdate
  3. 结束阶段:这边要注意的一个点,就是有时候字生成不一定代表输入结束,像繁体中文输入法中输入完成生成中文字符之后还可以进行选字,这时候实际上要再输入 enter 结束输入状态,这时候才会触发 compositionend

代码示例

接下来我们就在 React 中试试

1. 非受控组件

  • /src/App.tsx

第一个实验我们先不对 input 的 value 进行控制,也就是所谓的不受控组件,而仅仅只是监听事件来看看他的顺序

import React, { useState } from 'react'

export default function App() {
  const handleChange = (e) => {
    console.log('onChange:', e.target.value)
  }

  const handleCompositionStart = (e) => {
    console.log('onCompositionStart:', e.target.value)
  }

  const handleCompositionUpdate = (e) => {
    console.log('onCompositionUpdate:', e.target.value)
  }

  const handleCompositionEnd = (e) => {
    console.log('onCompositionEnd:', e.target.value)
  }

  return (
    <div>
      <h1>JS 事件: Composition Input 组合输入事件</h1>
      <input
        type="text"
        onChange={handleChange}
        onCompositionStart={handleCompositionStart}
        onCompositionUpdate={handleCompositionUpdate}
        onCompositionEnd={handleCompositionEnd}
      />
    </div>
  )
}
  • 非组合文字输入

我们看到实际上普通的输入是不会触发组合输入相关的事件的

  • 中文输入

我们改成输入简体中文就可以看到触发了组合事件

2. 受控组件

这时候你可能会想,那 React 推荐的受控组件输入法会不会影响组件,这时候我们可以看看下面的例子

  • /src/App.tsx
import React, { useState } from 'react'

export default function App() {
  const [value, setValue] = useState('')

  const handleChange = (e) => {
    console.log('onChange:', e.target.value)
    setValue(e.target.value)
  }

  const handleCompositionStart = (e) => {
    console.log('onCompositionStart:', e.target.value)
  }

  const handleCompositionUpdate = (e) => {
    console.log('onCompositionUpdate:', e.target.value)
  }

  const handleCompositionEnd = (e) => {
    console.log('onCompositionEnd:', e.target.value)
  }

  return (
    <div>
      <h1>JS 事件: Composition Input 组合输入事件</h1>
      <input
        type="text"
        value={value}
        onChange={handleChange}
        onCompositionStart={handleCompositionStart}
        onCompositionUpdate={handleCompositionUpdate}
        onCompositionEnd={handleCompositionEnd}
      />
    </div>
  )
}

我们可以看到,虽然 change 确实也会捕捉输入过程的中间状态,但是实际上是不会打断组合输入的。

结语

更多关于组合输入事件监听的特性可以自己尝试,其实对于一般的输入处理我们并不需要特别利用组合输入来监听事件,但是我们有时候会希望只在特定时间例如文字完成瞬间才检查输入的时候,就可以用到相关事件监听来实现。

本篇的宗旨主要是抛出来分享有这么个事件能利用,供大家参考。

其他资源

参考连接

TitleLink
CompositionEvent - MDNhttps://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent

完整代码示例

https://github.com/superfreeeee/Blog-code/tree/main/front_end/javascript/js_composition_input


http://www.niftyadmin.cn/n/735240.html

相关文章

[Node.js源码解读(3)]Buffer的8KB池分配规则和固定位数字的读写

原作者&#xff1a;蔡伟。 经原作者授权连载于alinode官方博客&#xff0c;未经原作者允许&#xff0c;不得转载。 在 Node.js 中&#xff0c;Buffer 常常用来存储一些潜在的大体积数据&#xff0c;例如&#xff0c;文件和网络 I/O 所获取来的数据&#xff0c;若不指定编码&…

Ubuntu apt-get和pip国内源更换

Ubuntu apt-get和pip源更换 更新数据源为国内&#xff0c;是为了加速安装包的增加速度。 更换apt-get数据源 输入&#xff1a;sudo -s切换为root超级管理员&#xff1b;执行命令&#xff1a;vim /etc/apt/sources.list&#xff1b;使用命令&#xff1a;%d 清空所有内容&#xf…

CSS 应用: 文本溢出省略效果(单行/多行)

CSS 应用: 文本溢出省略效果(单行/多行) 文章目录CSS 应用: 文本溢出省略效果(单行/多行)前言正文使用属性介绍1. 单行文本溢出2. 多行文本溢出结语其他资源参考连接完整代码示例前言 本篇主要介绍一个在 css 中还挺常见的文本溢出省略效果&#xff0c;也就是指定行数之后就会…

CSS 滚动条: 自定义滚动条样式

CSS 滚动条: 自定义滚动条样式 文章目录CSS 滚动条: 自定义滚动条样式前言正文overflow & ::-webkit-scrollbar实际效果&#xff08;自定义滚动条、隐藏滚动条&#xff09;结语其他资源参考连接完整代码示例前言 本篇来介绍如何为自己的网页定制化自己的滚动条 正文 由于…

pfSense 2.4.3-RELEASE-p1和2.3.5-RELEASE-p2发布!

2018年5月14日作者&#xff1a;Jim Pingle我们很高兴宣布pfSense软件版本2.4.3-p1和2.3.5-p2已经发布&#xff0c;现在可以用于升级&#xff01;pfSense软件版本2.4.3-p1和2.3.5-p2是维护版本&#xff0c;是针对pfSense 2.4.3和2.3.5-p1版本中存在的问题提供安全补丁和稳定性修…

Webpack: CSS 到 Sass/Scss 与 CSS Module

Webpack: CSS 到 Sass/Scss 与 CSS Module 文章目录Webpack: CSS 到 Sass/Scss 与 CSS Module前言正文1. 在 JS 中引入 CSS&#xff1a;style-loader、css-lodaer2. 从 CSS 进阶到 SCSS&#xff1a;sass-loader node-sass3. CSS Module 实现命名空间隔离&#xff1a;css-loade…

Intellij常见疑难解答集锦

2019独角兽企业重金招聘Python工程师标准>>> 一、调字体 1、Intellij如何调大Terminal的大小(win7Intellij2016) File->Settings->Editor->Colors&Fonts 具体见下图 2、菜单栏字体大小&#xff0c;见下图 二、如何给项目改名 要改好多地方&#xff0c;…

VS2013使用EF6与mysql数据库

2019独角兽企业重金招聘Python工程师标准>>> VS2013使用EF6与mysql数据库出现的问题&#xff1a;https://blog.csdn.net/niewq/article/details/41877301 使用VS2013 EF6 .NET4.5 连接Mysql数据库 https://www.cnblogs.com/wangwust/p/6638666.html VS2012 EF6.x…