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


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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
prototype 中文参数乱码解决方案
Nov 09 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
jquery如何判断某元素是否具备指定的样式
Nov 05 Javascript
兼容主流浏览器的iframe自适应高度js脚本
Jan 10 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
May 05 Javascript
JQuery异步获取返回值中文乱码的解决方法
Jan 29 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
JavaScript数组操作函数汇总
Aug 05 Javascript
简易Vue评论框架的实现(父组件的实现)
Jan 08 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
May 24 Javascript
Echarts如何重新渲染实例详解
May 30 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
phplot生成图片类用法详解
2015/01/06 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
Python 正则表达式操作指南
2009/05/04 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python openpyxl使用方法详解
2019/07/18 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
你们项目是如何进行变更控制的
2015/08/26 面试题
《纸船和风筝》教学反思
2014/02/15 职场文书
房屋租赁意向书
2014/04/01 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
单位接收函格式
2015/01/30 职场文书
话题作文之学会尊重
2019/12/16 职场文书
Nginx跨域问题解析与解决
2022/08/05 Servers