即时搜索:对于ios自带输入法输入中文时多次触发input事件的处理

本文介绍了一种解决iOS设备上使用自带输入法输入汉字时,多次触发input事件的问题的方法。通过利用compositionstart和compositionend事件结合状态变量的方式,有效避免了用户体验上的困扰。
部署运行你感兴趣的模型镜像

实现移动端的即时搜索的最佳方案,一定是使用input propertychange事件了,但是在ios设备上遇到了问题,使用ios自带输入法输入汉字时,会出现多次触发input事件的情况,一开始可能由于搜索的关键字不得法,没有即时找到合适的方案,后来终于在网上找到了解决方案,现记录如下:

代码实现

/**
* @param flag: 用于标记是否是非直接的文字输入
*/
var flag = false;
$('#id').on({
    'compositionstart': function() {
      flag = true;
    },
    'compositionend': function() {
      flag = false;
      if(!flag) {
        //do something...
        doSomethingFunction();
      }
    },
    'input propertychange': function() {
        if(!flag) {
          //do something...
          doSomethingFunction();
        }
    }
});
  • 实现原理:借助 compositionstart 和 compositionend 两个事件来作为一个开关,同时借助状态变量,只在文字输入结束之后再触发input事件
  • 使用该方式处理之后,如果只是需要输入英文,那么需要点击enter确定才触发

根据规范,Composition 事件触发顺序如下:

  • 输入开始时触发 compositionstart
  • 选择字/词完成输入时触发 compositionend
  • 输入过程中每次击键时触发 compositionupdate,包括 start 事件以后立即触发,end 事件以前立即触发
  • Composition 事件以后触发 input 事件

通过 Composition 事件,在 compositionend 里校验非直接输入,就能有效地避免不恰当的校验时机产生的用户体验问题。

 

原文链接:https://www.cnblogs.com/chaoyueqi/p/9166769.html

相关参考资料:https://csspod.com/dom-composition-event/

                         http://www.cnblogs.com/lonhon/p/7643095.html

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

iOS端小程序里,当使用系统中文输入法,直接点击其他输入框切换焦点可能会出现未调用 `onInput` 事件的情况。可以尝试以下解决办法: ### 1. 利用 `bindinput` 和 `bindblur` 事件结合 在小程序的 `wxml` 文件里,为输入框绑定 `bindinput` 和 `bindblur` 事件。`bindinput` 事件输入内容触发,`bindblur` 事件输入框失去焦点触发。在 `bindblur` 事件处理未调用 `onInput` 事件的情况。 示例代码如下: ```xml <!-- wxml 文件 --> <input bindinput="onInput" bindblur="onBlur" placeholder="请输入内容" /> ``` ```javascript // js 文件 Page({ data: { inputValue: '' }, onInput: function (e) { this.setData({ inputValue: e.detail.value }); // 处理输入事件 console.log('输入内容:', this.data.inputValue); }, onBlur: function (e) { if (this.data.inputValue!== e.detail.value) { this.setData({ inputValue: e.detail.value }); // 处理未调用 onInput 事件的情况 console.log('失去焦点更新内容:', this.data.inputValue); } } }); ``` ### 2. 借助 `compositionstart` 和 `compositionend` 事件 参考前端处理中文输入触发多次 `input` 事件的思路,利用 `compositionstart` 和 `compositionend` 事件来判断输入状态。在输入框失去焦点,检查是否处于输入状态,若未处理输入内容,则进行处理。 示例代码如下: ```xml <!-- wxml 文件 --> <input bindinput="onInput" bindblur="onBlur" bindcompositionstart="onCompositionStart" bindcompositionend="onCompositionEnd" placeholder="请输入内容" /> ``` ```javascript // js 文件 Page({ data: { inputValue: '', isTypingPinyin: false }, onInput: function (e) { if (!this.data.isTypingPinyin) { this.setData({ inputValue: e.detail.value }); // 处理输入事件 console.log('输入内容:', this.data.inputValue); } }, onBlur: function (e) { if (!this.data.isTypingPinyin && this.data.inputValue!== e.detail.value) { this.setData({ inputValue: e.detail.value }); // 处理未调用 onInput 事件的情况 console.log('失去焦点更新内容:', this.data.inputValue); } }, onCompositionStart: function () { this.setData({ isTypingPinyin: true }); }, onCompositionEnd: function () { this.setData({ isTypingPinyin: false }); } }); ``` ### 3. 手动触发 `onInput` 事件输入框失去焦点,手动触发 `onInput` 事件,保证输入内容得到处理。 示例代码如下: ```xml <!-- wxml 文件 --> <input bindinput="onInput" bindblur="onBlur" placeholder="请输入内容" /> ``` ```javascript // js 文件 Page({ data: { inputValue: '' }, onInput: function (e) { this.setData({ inputValue: e.detail.value }); // 处理输入事件 console.log('输入内容:', this.data.inputValue); }, onBlur: function (e) { const inputValue = e.detail.value; if (this.data.inputValue!== inputValue) { this.setData({ inputValue: inputValue }); // 手动触发 onInput 事件 this.onInput({ detail: { value: inputValue } }); } } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值