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


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 相关文章推荐
基于jquery实现点击左右按钮图片横向滚动
Apr 11 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
JavaScript判断用户名和密码不能为空的实现代码
May 16 Javascript
bootstrap输入框组代码分享
Jun 07 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
利用PM2部署node.js项目的方法教程
May 10 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
EasyUI创建人员树的实例代码
Sep 15 Javascript
关于vue中 $emit的用法详解
Apr 12 Javascript
微信小程序实现购物车代码实例详解
Aug 29 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 ZipArchive压缩函数详解实例
2013/11/06 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
用实例说明python的*args和**kwargs用法
2013/11/01 Python
python实现sublime3的less编译插件示例
2014/04/27 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python冲顶大会 快来答题!
2018/01/17 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
python高级特性简介
2020/08/13 Python
python实现xml转json文件的示例代码
2020/12/30 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
Python中如何定义一个函数
2016/09/06 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
公司周年庆活动方案
2014/08/25 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis
Python之matplotlib绘制折线图
2022/04/13 Python
windows系统安装配置nginx环境
2022/06/28 Servers