输入法的回车与消息发送快捷键回车的冲突解决方法


Posted in Javascript onAugust 09, 2016

问题:在中文输入法输入文字时按ENTER键;绑定keyup事件会将输入法中的英文文字输入到文字框并直接触发发送按钮

键盘事件:

当一个按键被pressed或者released,在每一个浏览器中都可能会触发三种键盘事件

keydown
keypress
keyup

keydown事件发生在按键被按下的时候,接着触发keypress,松开按键的时候触发keyup事件

中文输入法:

firfox:输入触发keydown,回车确认输入触发keyup
chrome:输入触发keydown、keyup,回车确认输入只触发keydown
IE:输入触发keydown、keyup,回车确认输入触发keydown,keyup
Safari:输入触发keydown、keyup,回车确认输入触发keydown,keyup
opera:输入触发keydown、keyup,回车确认输入触发keydown,keyup
在input、textarea中,中文输入法时:没有触发keypress事件

keypress事件:对中文输入法支持不好,无法响应中文输入;无法响应系统功能键

HTML代码:

<textarea name="" id="text" cols="30" rows="5"></textarea> 
  <script type="text/javascript"> 
    var text = document.getElementById('text'); 
    text.onkeydown = function(e) { 
      console.log('keydown'); 
      if(e.keyCode == 13) { 
        console.log('keydown enter send'); 
      } 
      console.log('value', text.value); 
    } 
    text.onkeypress = function(e) { 
      console.log('keypress'); 
      console.log('value', text.value); 
    } 
    text.onkeyup = function(e) { 
      console.log('keyup'); 
      if(e.keyCode == 13) { 
        console.log('keyup enter send'); 
      } 
      console.log('value', text.value); 
    } 
  </script>

英文输入法:

输入法的回车与消息发送快捷键回车的冲突解决方法

上图可得结论:

keydown、keypress发生在文字还没敲入输入框时,如果在keydown、keypress事件中输出文本框的文本,得到的是触发键盘事件前文本框中的文本;

keyup事件触发时,整个键盘事件输入文字的操作已经完成,得到的是触发键盘事件后的文本内容。

中文输入法:【没有keypress事件

输入法的回车与消息发送快捷键回车的冲突解决方法

按下enter键确认后:

输入法的回车与消息发送快捷键回车的冲突解决方法

中文输入法在输入未确定时按下回车键,keydown与keyup效果不同,keydown不会触发预设的回车方法事件

解答:

大多数输入法都是在keydown中完成输入过程,所以如果回车提交是在keyup事件中的话就会出现输完字后直接触发回车键提交,从而产生冲突问题。

办法:回车提交事件改为keydown,这时候当keydown事件发生的时候是在输入法上,而不会发生在提交框的发送事件上,进而解决了冲突。 

部分tips:

KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件。

KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符

KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键

KeyPress 只能捕获单个字符

KeyDown 和KeyUp 可以捕获组合键。

KeyPress 可以捕获单个字符的大小写

KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。

KeyPress 不区分小键盘和主键盘的数字字符。

KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。

其中PrScrn 按键KeyPress、KeyDown和KeyUp 都不能捕获。

在使用键盘的时候,通常会使用到CTRL+SHIFT+ALT 类似的组合键功能。

以上这篇输入法的回车与消息发送快捷键回车的冲突解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中创建对象和继承示例解读
Feb 12 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
12个超实用的JQuery代码片段
Nov 02 Javascript
js 轮播效果实例分享
Dec 28 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
基于AGS JS开发自定义贴图图层
Mar 31 Javascript
React Native react-navigation 导航使用详解
Dec 01 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
详解小程序缓存插件(mrc)
Aug 17 Javascript
Vue获取微博授权URL代码实例
Nov 04 Javascript
React配置子路由的实现
Jun 03 Javascript
jQuery实现点击查看大图并以弹框的形式居中
Aug 08 #Javascript
jQuery实现鼠标经过像翻页和描点链接效果
Aug 08 #Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
Aug 08 #Javascript
jQuery操作cookie
Aug 08 #Javascript
轮播图组件js代码
Aug 08 #Javascript
JavaScript面试开发常用的知识点总结
Aug 08 #Javascript
Js 获取、判断浏览器版本信息的简单方法
Aug 08 #Javascript
You might like
php下使用以下代码连接并测试
2008/04/09 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
Node.js的特点详解
2017/02/03 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
js序列化和反序列化的使用讲解
2019/01/19 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
python实现在字符串中查找子字符串的方法
2015/07/11 Python
详解Python import方法引入模块的实例
2017/08/02 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python实现FLV视频拼接功能
2020/01/21 Python
使用django自带的user做外键的方法
2020/11/30 Python
python实现KNN近邻算法
2020/12/30 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
2014年社区工会工作总结
2014/12/18 职场文书
Python基本数据类型之字符串str
2021/07/21 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python