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


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 相关文章推荐
繁简字转换功能
Jul 19 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
Mar 05 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
Oct 28 Javascript
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
AngularJS service之select下拉菜单效果
Jul 28 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 Javascript
微信小程序 Animation实现图片旋转动画示例
Aug 22 Javascript
js html实现计算器功能
Nov 13 Javascript
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
微信小程序rich-text富文本用法实例分析
May 20 Javascript
JS事件循环机制event loop宏任务微任务原理解析
Aug 04 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
星际争霸中的热键
2020/03/04 星际争霸
图形数字验证代码
2006/10/09 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
js实现的常用的左侧导航效果
2013/10/17 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
Angular的$http与$location
2016/12/26 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
在keras里实现自定义上采样层
2020/06/28 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
医学生个人求职信范文
2013/09/24 职场文书
党章学习心得体会2016
2016/01/14 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android