解决input输入中文时,拼音在输入框内会触发input事件的问题

问题描述:

监听文本输入框的input事件,在拼写汉字(输入法)但汉字并未实际填充到文本框中(选词)时会触发input事件,如图:

Alt

需求:选词完成后触发input事件,只触发一次。

解决办法:

通过查阅资料得知在输入中文(包括语音识别时)会先后触发compositionstart、compositionend事件,类似于keydown和keyup的组合。

触发compositionstart时,文本框会填入 “虚拟文本”(待确认文本),同时触发input事件;在触发compositionend时,就是填入实际内容后(已确认文本)。

先看看 compositionstart 的描述 和 compositionend 的 描述

compositionstart 事件触发于一段文字的输入之前(类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词)。

compositionend 当文本段落的组织已经完成或取消时,会触发该事件。

个人理解:

compositionstart 在输入一段需要确认的文本如拼音to汉字、语音时会触发

compositionend 在拼音选词完成、语音输入完毕时会触发

至此,思路get: 声明一个标记flag,在compositionstart、compositionend两个事件过程之间的时候flag值为false,在input事件中通过flag的值来判断当前输入的状态。

OK,接下来贴出示例代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
        <title></title>
    </head>
    <body>
    <input id="txt" type="text">
    <script>
        var flag = true;
        $('#txt').on('compositionstart',function(){
            flag = false;
        })
        $('#txt').on('compositionend',function(){
            flag = true;
        })
        $('#txt').on('input',function(){
            var _this = this;
            setTimeout(function(){
                if(flag){
                    console.log($(_this).val());
                }
            },0)
        })
    </script>
    </body>
</html>

效果图:
Alt

tips:
  为什么使用延时器?
  因为选词结束的时候input会比compositionend先一步触发,此时flag还未调整为true,所以不能触发到console,故用setTimeout将其优先级滞后。

### 如何在前端开发中阻止按回车键触发输入事件 #### HTML 表单中的解决方案 如果使用的是标准的 `<form>` 元素,则可以通过 `event.preventDefault()` 方法来阻止表单的默认提交行为。这通常发生在用户按下回车键,浏览器会尝试提交整个表单[^1]。 ```html <form onsubmit="return false;"> <input type="text" /> </form> ``` 通过将 `onsubmit` 属性设置为返回 `false` 或者绑定 JavaScript 的 `preventDefault` 函数可以有效避免这种现象的发生。 --- #### Vue.js 中的解决方案 对于基于 Vue.js 的架(如 Element UI),当在一个 `el-form` 容器内的 `el-input` 上按下回车键,默认情况下可能会触发表单的提交事件。这是因为浏览器原生的行为所致[^4]。 为了防止这种情况发生,可以在 `el-form` 标签上添加 `.native` 修改符,并调用 `@submit.native.prevent` 来阻止默认提交动作: ```vue <template> <el-form :model="form" @submit.native.prevent> <el-form-item label="请输入"> <el-input v-model="form.inputValue" @keyup.enter.native="handleEnter"></el-input> </el-form-item> </el-form> </template> <script> export default { data() { return { form: { inputValue: '' } }; }, methods: { handleEnter(event) { console.log('回车键已捕获', event); // 自定义处理逻辑 } } }; </script> ``` 上述代码片段展示了如何利用 Vue.js 和 Element UI 实现对回车键的控制,同避免不必要的表单提交操作[^5]。 --- #### 特殊场景下的中文输入问题 某些特定情况可能涉及中文输入法环境下的特殊行为。例如,在用户尚未完成拼音转汉字之前就按下回车键,可能导致意外的结果。此需要进一步确认键盘事件的实际触发机以及目标元素的状态[^2]。 一种可行的办法是在监听函数内部增加额外判断条件,确保仅响应合法状态下的按键组合: ```javascript methods: { handleEnter(e) { const target = e.target; if (target.tagName === 'INPUT' && !e.defaultPrevented) { e.preventDefault(); // 明确停止冒泡与默认行为 this.searchAction(target.value); // 调用自定义业务流程 } }, searchAction(value) { alert(`正在查询关键词 "${value}"`); } } ``` 此方式能够兼顾多语言支持的同保持良好的用户体验一致性。 --- ### 总结 综上所述,针对不同技术栈和具体需求可以选择合适的策略应对回车键引发的问题。无论是传统 DOM 操作还是现代组件化架构下均存在成熟的实践方案可供借鉴实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值