前端input输入框,@input事件输入中文触发两次——解决方案

问题描述

这个问题可能是因为在使用中文输入法输入时,当你还在输入过程中(还未选择和确定最终的汉字词组)就会触发input事件,也就是说在你输入拼音的过程中就已经触发了input事件,等你选择了正确的汉字之后,又会再次触发input事件。这样就会造成在中文输入过程中,input事件触发两次的现象。

解决办法

方式一:
比较有效的解决办法是使用compositionstartcompositionend这两个事件来限制input事件的触发。

  • compositionstart事件在你开始一个新的复合输入,即开始输入拼音时就会触发。
  • compositionend事件在你结束复合输入,即你选择了正确的汉字并将其输入到文本框后触发。

你可以在compositionstart事件开始时设定一个标志位,然后在input事件中先判断这个标志位,如果标志位为真(表示正在进行复合输入,即拼音输入过程中),则不处理input事件,等到compositionend事件发生时(表示完成了拼音输入,已经确定了要输入的汉字),再处理input事件。这样就可以避免在输入中文时input事件被连续触发两次的问题。

案例如下:

//首先,我们设置一个全局变量isTypingPinyin用来判断当前是否在进行拼音输入。
let isTypingPinyin = false;
//然后,我们可以在input标签的compositionstart和compositionend事件上进行监听,以便知道什么时候开始和结束拼音输入。
document.getElementById('myInput').addEventListener('compositionstart', () => {
	//在compositionstart事件触发时,即在拼音输入开始时,我们把isTypingPinyin设置为true;
    isTypingPinyin = true;
});

document.getElementById('myInput').addEventListener('compositionend', () => {
	//在compositionend事件触发时,即在拼音输入结束时,我们把isTypingPinyin设置为false。
    isTypingPinyin = false;
});
//最后,我们可以在input标签的input事件上做一次判断,如果isTypingPinyin为true,即当前正在进行拼音输入,那么就不处理这次input事件;如果isTypingPinyin为false,那么就说明输入已经结束,可以处理这次input事件。
document.getElementById('myInput').addEventListener('input', () => {
  if (!isTypingPinyin) {
    // Handle the input event
    console.log('文本已更新');
  }
});

这样一来,我们就能确保在拼音输入过程中,input事件只在输入完成后被触发一次。
方式二:
方式二是我自己想出的办法,实测也可以解决,原理也比较简单

input(e) {
	if(e){
		var _this = this;
		setTimeout(() => {
			if(_this.flag){
				_this.flag=false;//在data中设置全局变量flag
				console.log(e);	
			}
		}, 200)
	}
},
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
input输入框停止输入触发事件可以通过监听input元素的input事件来实现。当用户在input输入框输入文字时,每输入一个字符都触发一次input事件。我们可以通过设置一个计时器,在用户停止输入一段时间后触发所需的事件。 具体的实现步骤如下: 1. 监听输入框input事件,当该事件触发时,执行相应的处理函数。 2. 在处理函数中,首先清除之前设置的计时器(如果有),然后设置一个新的计时器。 3. 在计时器的回调函数中执行需要触发事件。在这个例子中,我们可以弹出一个提示框作为示例。 下面是一个简单的实现示例: ```html <!DOCTYPE html> <html> <head> <title>Input Stop Event</title> </head> <body> <input id="myInput" type="text" /> <script> let timer; const inputElement = document.getElementById('myInput'); inputElement.addEventListener('input', function() { clearTimeout(timer); // 清除计时器 timer = setTimeout(() => { alert('输入停止!'); // 在用户停止输入0.5秒后触发事件 }, 500); }); </script> </body> </html> ``` 在以上示例中,我们监听了id为"myInput"的input元素的input事件,并在事件处理函数中设置了一个计时器。当用户输入文字时,每次input事件触发时,都清除之前设置的计时器,并重新设置一个新的计时器。当用户停止输入0.5秒后,计时器的回调函数被执行,触发一个提示框弹出,表示输入已经停止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值