input 输入中文,高频触发 onchange和oninput事件(CompositionEvent API解决)

news2024/9/29 15:19:24

问题描述:

input onchange和oninput 事件输入中文时高频触发。

输入字母,数字,符号都没问题:
在这里插入图片描述
输入中文时问题就出来了:
每个拼音字母都触发了change,甚至输入法里的nin’hao 把拼音分开的字符也会触发。
在这里插入图片描述
基础代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="text" id="name">
</body>
<script>
  // 1. 获取元素
  var inp = document.getElementById('name');
  console.log(inp);
  // 2. 添加事件
  inp.addEventListener('input', function () {
    // 3. 获取输入的内容
    var value = inp.value;
    // 4. 输出内容
    search(value);
  });

  // search 是请求接口
  function search(value){
    
  }
</script>

</html>

解决方案:

解决方案就是用 CompositionEvent 事件里的onCompositionStart 和onCompositionEnd 解决:

  • onCompositionStart 事件在用户开始使用输入法输入时触发。在这个事件中,你可以禁用或延迟处理 onChange 事件,以避免在输入过程中重复触发。

  • onCompositionUpdate 事件在用户正在使用输入法输入时触发。在这个事件中,你可以更新输入框的值,但通常不会在这个事件中执行一些重要的操作。

  • onCompositionEnd 事件在用户完成使用输入法输入时触发。在这个事件中,你可以处理最终的输入结果,更新输入框的值,并执行一些重要的操作,如发送请求、更新页面等。
    这些事件主要用于处理复合字符输入,例如在中文输入法中,用户可能会输入一段拼音,然后选择对应的汉字组成词语,最后将整个词语输入到输入框中。这个过程中, onCompositionStart 会在输入开始时触发, onCompositionUpdate 会在输入过程中触发, onCompositionEnd 会在输入结束时触发。
    通过使用这些事件,我们可以更好地控制输入法输入的过程,避免在输入中文拼音时多次触发 onChange 事件,并在最终输入完成时触发相应的处理逻辑。

思路:
1.定义一个全局变量 isComposing,当 onCompositionStart 正在输入时给其赋值 为true。
2.onCompositionEnd 输入结束时,给其设置成 false。
3.然后在 change和input里判断这个值,等于true时不执行搜索即可。

具体代码如下:
需要注意的是在 compositionend 事件触发时,浏览器会继续触发 input 事件,所以 search 函数会在 input 事件中被执行。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="text" id="name">
</body>
<script>
  var inp = document.getElementById('name');
  var isComposing = false;
  inp.addEventListener('compositionstart', function () {
    isComposing = true;
    console.log('中文开始输入');
  })
  inp.addEventListener('compositionend', function () {
    isComposing = false;
    console.log('中文结束输入');
    search(inp.value);
  })
  inp.addEventListener('input', function () {
    if (isComposing) {
      return;
    }
    var value = inp.value;
    // 执行搜索逻辑
    search(value);
  });
  function search(value) {
    console.log(value, "执行搜索");
    // 实际的搜索逻辑
  }
</script>

</html>

这回只执行了一次:
效果图

MDN CompositionEvent API

react 里则是使用onCompositionEnd、onCompositionStart解决。思路写法是一样的转换成react语法就行。

代码如下:

import React, { useState} from "react";

function Inp() {
  //input值
  const [value, setValue] = useState("");
  //是否输入完成值
  const [isComposing, setIsComposing] = useState(false);

  const handleCompositionEnd = (e) => {
    setIsComposing(false);
    search();
  };

  const handleCompositionStart = (e) => {
    setIsComposing(true);
  };

  const handleChange = (e) => {
    let val = e.target.value;
    // console.log(val);
    setValue(val);
    if (isComposing) return;
    search();
  };

  const search = () => {
    console.log(value,"执行搜索");
  };
  return (
    <div className="sss">
      <input
        type="text"
        onCompositionEnd={handleCompositionEnd}
        onCompositionStart={handleCompositionStart}
        onChange={handleChange}
        value={value}
      />
    </div>
  );
}
export default Inp;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git clone 遇到了 early EOF index-pack failed 问题

问题 由于仓库包含了很多文件&#xff0c;仓库过大&#xff0c;导致clone的时候一直报错&#xff1a; 解决方案 注意&#xff1a;过程中需要耐心等待&#xff0c;如果遇到失败&#xff0c;可以多尝试几遍。 压缩目标仓库文件 compression 是压缩的意思&#xff0c;从 clo…

javaweb请求

1.给类加上RestController表示该类是请求处理类 2.判断类里面的hello()方法处理哪个请求&#xff0c;需在方法上加上注解RequestMapping("/hello"),表示浏览器请求localhost:8080/hello这个地址时&#xff0c;会调用此方法&#xff0c;

使用boost.mysql来操作mysql 数据库

准备条件 1. visual studio 2019 2. boost库 3. 安装本地的mysql 服务器&#xff0c;boost.mysql对mysql有版本要求最好8.0&#xff0c;具体参考官方文档 安装 使用Nuget安装boost 要安装 openssl&#xff0c;否则的话编译其他项目会产生依赖ssl的错误 安装mysql 省略 …

“数聚瑞安·创新未来”中国·瑞安第四届创新创业大赛圆满举办!

10月26日&#xff0c;“数聚瑞安 创新未来”中国瑞安第四届创新创业大赛决赛在瑞安东新科创园举行。本次大赛旨在挖掘优质的创新创业项目激活本地创新创业氛围&#xff0c;激发创新创业活力&#xff0c;数字科创赛道吸引了来自全国20多个省市自治区的50多个城市的100多家企业和…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

U盘RAW格式无法格式化怎么办?

我们在使用U盘时候&#xff0c;有时会碰到U盘RAW格式无法格式化的情况。当U盘变为RAW格式时&#xff0c;无论是双击还右键选择打开U盘&#xff0c;Windows系统都会提示无法完成格式化。那遇到RAW格式U盘无法格式化怎么办&#xff1f; 什么是RAW格式&#xff1f; 在开始格式化之…

学编程如何提高自己的编程能力

以下是一些建议&#xff0c;帮助你提高编程能力&#xff1a; 掌握基础知识。了解编程语言的基本语法、数据类型、控制结构等基础知识&#xff0c;是提高编程能力的基础。多写代码。编程需要实践&#xff0c;多写代码才能提高编程能力。可以从简单的练习项目开始&#xff0c;逐…

SpringCloudAlibaba实战-nacos集群部署

写在前面&#xff1a;在学习阶段&#xff0c;我们想快速学习SpringCloudAlibaba功能&#xff0c;但总是花费大量时间跟着视频或博客做组件配置。由于版本的更迭&#xff0c;我们学习时的组件版本很可能和作者的不一致&#xff0c;又或者是各自环境不一&#xff0c;只能一坑又一…

C++前缀和算法的应用:统计得分小于K的子数组数目

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 一个数组的分数定义为数组之和 乘以 数组的长度。 比方说&#xff0c;[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整…

【C】关于动态内存的试题及解析

目录 第1题&#xff1a; 第2题&#xff1a; 第3题&#xff1a; 第4题&#xff1a; 第5题&#xff1a; 在学习了关于动态开辟内存的相关知识后&#xff0c;下面是一些涉及到动态开辟内存程序的试题及解析&#xff08;试题部分来自《高质量的C/C编程》、笔试题&#xff09;。 第1…

2023年【上海市安全员A证】报名考试及上海市安全员A证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员A证报名考试是安全生产模拟考试一点通总题库中生成的一套上海市安全员A证试题及解析&#xff0c;安全生产模拟考试一点通上上海市安全员A证作业手机同步练习。2023年【上海市安全员A证】报名考试及上海市…

智能指针(C++11)

行到水穷处&#xff0c;坐看云起时。 文章目录 简介内存泄漏内存泄漏分类内存泄漏检测工具 RAII智能指针原理智能指针使用std::auto_ptrstd::unique_ptrstd::shared_ptrstd::shared_ptr循环引用 std::weak_ptr 总结 简介 C智能指针是在C11标准引入的一项重要功能&#xff0c;用…

建模仿真软件 Comsol Multiphysics mac中文版软件介绍

COMSOL Multiphysics mac是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件&#xff0c;拥有、网格划分、研究和优化、求解器、可视化和后处理、仿真 App等相关功能&#xff0c;轻松实现各个环节的流畅进行&#xff0c;它能够解释耦合或多物理现象。 附加产品扩展了…

Postman接口测试,全网最详细教程

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 0 1****环境准备 1、安装python &#xff08;使用python2或3都可以&#x…

Spring源码-4.Aware接口、初始化和销毁执行顺序、Scope域

Aware接口 其实在生命周期中&#xff0c;Aware接口也参与进来了&#xff0c;如图所示&#xff1a; 如初始化时的第三步&#xff0c;其实就是调用了Aware相关接口。 以常见的Aware接口举例&#xff1a; 1.BeanNameAware 主要是注入Bean的名字 2.BeanFactoryAware 主要是时注…

ESP32开发日志记录

用过一段时间的ESP8266开发&#xff0c; 是在ubunut下建立的开发环境&#xff0c;现在ESP32更简单&#xff0c;直接在Window下IDE即可完成系统配置、新建工程及编译下载工作&#xff0c;使用起来更加简便 一、生成ESP32的工程运行出错 大概意思的芯片是单核芯片&#xff0c;但…

有什么软件能实现erp、crm、oa、财务系统一体化?

只要你能梳理清楚业务逻辑&#xff0c;没有代码基础也完全可以自己搭建业务系统&#xff0c;比ERP管理系统、工程项目管理系统等等......用简道云就可以轻松实现&#xff1a; 下面来按照题主的需求介绍几个系统&#xff1a; 01 客户关系——CRM客户管理套件 重磅打造客户跟进、…

阿里p8推荐,测试覆盖率工具—Jacoco

测试覆盖率工具 测试过程中根据需求文档和设计文档编写测试用例、执行测试&#xff1b;为了更加全面的覆盖&#xff0c;我们可能还需要理解被测程序的逻辑&#xff0c;需要考虑到每个函数的输入与输出&#xff0c;逻辑分支代码的执行情况&#xff0c;这个时候我们的测试执行情…

鉴源论坛 · 观擎丨基于模型的方法在民机机载软件中的应用

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 基于模型的开发和验证MBDV 模型泛指用于支持软件开发过程或软件验证过程的系统的一组软件方面的抽象表示&#xff0c;在机载软件…

【深度学习】【NLP】如何得到一个分词器,如何训练自定义分词器:从基础到实践

文章目录 什么是分词&#xff1f;分词算法使用Python训练分词器步骤1&#xff1a;选择分词算法步骤2&#xff1a;准备训练语料步骤3&#xff1a;配置分词器参数步骤4&#xff1a;训练分词器步骤5&#xff1a;测试和使用分词器 代码示例&#xff1a;使用SentencePiece训练分词器…