`

input事件中文触发多次问题研究(转)

    博客分类:
  • JS
 
阅读更多

原文链接

 

我们在网页中经常会遇到实时搜索的情况,或者其他类似需要input实时响应的问题,一般情况下,我们是利用input和propertychange事件来监听input内容的变化来响应,但是有一个问题就是当输入汉字的时候,可能我们要输入 ‘实时’ 的时候,我们的input框中会出现 'shishi'直到我们的空格才会变成 '实时',这也就意味着我们依次响应了 's','sh','shi','shis','shish','shishi','实时',前面的结果明显不是我们需要的 ,造成了我们很多次无用的提交,如果是接口请求,那更要命,多发了好多次请求。

  最早之前有一个稍微能改善的解决方案就是配合一个定时器延时执行,这样能减少请求次数,但是这个减少是不分情况的减少 ,还是治标不治本。

  今天偶然看到几个事件,发现可以完美解决这种问题。我们来看一下这几个事件

  compositionstart , compositionupdate ,compositionend  

  compositionstart 官方解释 : 触发于一段文字的输入之前(类似于 keydown 事件,但是该事件仅在若干可见字符的输入之前,而这些可见字符的输入可能需要一连串的键盘操作、语音识别或者点击输入法的备选词),通俗点,假如我们要输入一段中文,当我们按下第一个字母的时候触发 。

  相应的compositionupdate在我们中文开始输入到结束完成的每一次keyup触发。

  而compositionend则在我们完成当前中文的输入触发 。

  正题来了,通过上面的事件我们就可以完美的解决中文输入的响应问题了,从compositionstart触发开始,意味着中文输入的开始且还没完成,所以此时我们不需要做出响应,在compositionend触发时,表示中文输入完成,这时我们可以做相应事件的处理。

  所以我们可以设置一个变量,或者给input定义一个属性,在compositionstart到compositionend之间对input事件不做出响应。看以下代码

$('input').on({
  input : function(e){        
      var flag = e.target.isNeedPrevent;
      if(flag)  return;     
      response() 
  },
  compositionstart : function(e){
      e.target.isNeedPrevent = true ;
  },
  compositionend : function(e){
      e.target.isNeedPrevent = false;        
  }
})
function response(){
  $('div').append('<p>事 件触发</p>')
}

我们通过compositionstart,compositionend事件来设置flag,判断是否正在进行输入中文以控制input事件的响应,看上去没有问题,但实际执行时会发现在谷歌浏览器中input执行顺序要先于compositionend,火狐执行顺序正常,但compositionend会响应两次。这就导致谷歌浏览器中输入汉字不会响应input事件。当然也可以在compositionend事件中再执行一次response事件,这样的问题是在火狐浏览器中会多执行一次response,显然不是最优方案。

  经过试验,发现keyup和compositionend事件执行顺序在各大浏览器都保持一致,于是我们改成如下代码:

 $('input').on({
   keyup : function(e){        
       var flag = e.target.isNeedPrevent;
       if(flag)  return;     
       response() 
   },
   compositionstart : function(e){
       e.target.isNeedPrevent = true ;
   },
   compositionend : function(e){
       e.target.isNeedPrevent = false;  
       
   }
})
function response(){
       $('div').append('<p>事 件触发</p>')
} 

这样在各个浏览器基本保持一致了(兼容compositionstart的浏览器)。但是keyup有一个问题,比如通过鼠标复制粘贴的时候并不相应keyup事件,所以上面的事情我们还需要再优化下,keyup相应按键事件,input响应除了keyup之外的变化事件。代码如下

$('input').on({
    keyup : function(e){        
        var flag = e.target.isNeedPrevent;
        if(flag)  return;     
        response() ;
        e.target.keyEvent = false ;
        
    },
    keydown : function(e){
        e.target.keyEvent = true ; 
    },
    input : function(e){
        if(!e.target.keyEvent){
            response()
        }        
    },
    compositionstart : function(e){
        e.target.isNeedPrevent = true ;
    },
    compositionend : function(e){
        e.target.isNeedPrevent = false;
        
    }
})
function response(){
        $('div').append('<p>事 件触发</p>')
}

最终效果实现:
在线预览:

分享到:
评论

相关推荐

    jquery实现input输入框实时输入触发事件代码

    此外,从技术角度来看,`input`事件的兼容性较广,是推荐的方式,因为`propertychange`事件存在一些潜在的问题,比如在某些情况下会触发多次,这可能导致不必要的性能开销。 总结一下,要实现输入框实时输入触发...

    浅谈jquery点击label触发2次的问题

    点击事件是网页上常见的交互方式之一,但有时会遇到点击事件被触发多次的问题,特别是在点击label标签时触发了两次事件。本文针对这个问题展开讨论,并提供相应的解决方案。 首先,了解label标签和事件冒泡是解决此...

    stm32 外部上升沿触发ADC采集

    外部触发功能允许我们根据外部事件来启动ADC转换,而不是内部定时器或软件指令。这在需要精确同步或者避免错过任何重要信号变化的场合非常有用。在这个例子中,我们使用PB11引脚作为外部触发源,该引脚可以配置为...

    C2000系类DSP多重等脉宽调制触发区事件源的配置

    当多个TZ事件在同一PWM通道上发生时,由于只存在一个TZ标志来标识所选类型的触发事件(一次性触发或周期性触发),因此无法确定触发事件的具体来源。这个问题在实际应用中非常常见,尤其是在需要同时监测多种不同...

    jquery_input提示

    6. **性能优化**:在大型应用中,使用事件代理(`.on()`方法)可以提高性能,因为只需绑定一次事件,而不是为每个input元素单独绑定。 7. **响应式设计**:考虑到跨设备兼容性和不同屏幕尺寸,提示框的位置可能需要...

    解决layui动态添加的元素click等事件触发不了的问题

    然而,当我们动态添加元素到页面中时,可能会遇到这些新元素无法触发事件的问题。为了处理这种情况,我们需使用事件委托(Event Delegation)的技术。 事件委托,也就是利用事件冒泡的原理来处理事件。事件冒泡是指...

    Firefox不支持click方法的解决

    在 IE8 浏览器中,对于 input type=file 的文件上传控件,执行 click 方法只能触发 onclick 事件绑定的代码执行,而不能弹出文件选择对话框。这是因为 IE8 浏览器对文件上传控件的限制。 initEvent 方法用于初始化...

    jquery input checkbox 联动

    在实际项目中,我们可能需要多次使用这样的联动效果,所以可以将代码封装成一个可重用的函数: ```javascript function setupCheckboxLinkage() { $('input[type="checkbox"]').on('change', function() { var ...

    jquery-inputevent:jQuery的跨浏览器oninput事件

    `oninput`事件在用户输入内容时触发,允许开发者实时监控并处理表单元素中的变化。`jquery-inputevent`插件便是为了解决这一问题,提供了在所有主流浏览器中统一且可靠的`oninput`事件处理。 ### 插件介绍 `jquery...

    vue实现输入框的模糊查询的示例代码(节流函数的应用场景).docx

    例如,每输入一个字符都会触发事件,那假如我们需要输入很长的信息呢,那查询是不是就得触发多次?ajax 连续多次触发,再加上假如我们的方法体中有操作 DOM 元素的方法,那么必定会给我们的浏览器进入假死甚至崩溃...

    js创建一个input数组并绑定click事件的方法

    7. **提升性能**:当处理大量元素时,一次性绑定事件可能会消耗较多资源。可以通过分批处理或延迟加载来优化。同时,如果所有按钮的点击事件处理逻辑相同,可以只绑定一个事件处理函数,通过事件对象的`target`属性...

    微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)

    其原理是用时间戳来判断是否已到回调该执行时间,记录上次执行的时间戳,然后每次触发 scroll 事件执行回调,回调中判断当前时间戳距离上次执行时间戳的间隔是否已经到达 规定时间段,如果是,则执行,并更新上次...

    jquery上传文件点击input上传文件样式代码

    在网页开发中,jQuery是一个非常流行的JavaScript库,它极大地简化了DOM操作、事件处理和Ajax交互。本主题聚焦于利用jQuery来改进文件上传功能,尤其是针对`&lt;input type="file"&gt;`元素的样式和交互。在传统的HTML文件...

    javascript经典特效---input框的增加.rar

    这时,通过JavaScript动态添加新的input元素,可以提高用户的填写效率,避免他们多次刷新页面。 标签“Javascript”提示我们,这个话题完全聚焦于JavaScript语言本身及其在Web开发中的应用。JavaScript提供了丰富的...

    JQuery入门——用one()方法绑定事件处理函数(仅触发一次)

    总的来说,`one()`方法是jQuery中一个非常实用的工具,它提供了一种优雅的方式来管理一次性事件,避免了不必要的资源消耗和潜在的问题。在实际的Web开发中,善用`one()`可以提高代码的效率和用户体验。

    使用HTML开发商业网站-表单控件-input课件.pptx

    5. **按钮 (button)**: `&lt;input type="button"&gt;` 可以创建普通按钮,通常用于触发JavaScript事件。`value` 属性定义按钮上显示的文本。 示例: ```html &lt;input type="button" value="点击我" onclick="alert('...

    easyui-textbox和easyui-combobox的onchange事件响应实例

    `onchange` 事件是 JavaScript 中的一个重要事件,它会在元素的值发生改变并失去焦点后触发。在 EasyUI 中,`onchange` 事件同样适用于 `easyui-textbox` 和 `easyui-combobox`,可以用来监听用户在这些组件上的操作...

    angular 实时监听input框value值的变化触发函数方法

    在实际开发中,如果页面中有多个input框需要监听,就需要为每个需要监听的属性调用一次$watch方法。对于登陆页面的场景,通常是监听用户名和密码输入框的变化,然后根据这些输入值来决定登陆按钮是否可点击。示例...

    stm32 外部上升沿触发ADC采集_rezip.zip

    外部触发功能允许我们根据外部事件来启动ADC转换,而不是内部定时器或软件指令。这在需要精确同步或者避免错过任何重要信号变化的场合非常有用。在这个例子中,我们使用PB11引脚作为外部触发源,该引脚可以配置为...

Global site tag (gtag.js) - Google Analytics