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


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 相关文章推荐
让插入到 innerHTML 中的 script 跑起来的实现代码
Jul 01 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
Jun 19 Javascript
JS高级笔记
Jul 13 Javascript
jquery 卷帘效果实现代码(不同方向)
Feb 05 Javascript
cookie中的path与domain属性详解
Dec 18 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
smartupload实现文件上传时获取表单数据(推荐)
Dec 12 Javascript
详解angular2封装material2对话框组件
Mar 03 Javascript
mac上node.js环境的安装测试
Jul 03 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
Jul 27 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
Feb 05 Javascript
讲解vue-router之什么是嵌套路由
May 28 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--用万网的接口实现域名查询功能
2012/12/13 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
python求质数的3种方法
2018/09/28 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
python中取绝对值简单方法总结
2020/07/24 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
争论的故事教学反思
2014/02/06 职场文书
大学自我评价
2014/02/12 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
保研推荐信
2014/05/09 职场文书
公司收款委托书范本
2014/09/20 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
培训通知书模板
2015/04/17 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server