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


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 相关文章推荐
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
JavaScript 对象模型 执行模型
Dec 06 Javascript
js下用eval生成JSON对象
Sep 17 Javascript
利用jQuery操作对象数组的实现代码
Apr 27 Javascript
详解JavaScript数组的操作大全
Oct 19 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
Oct 17 Javascript
微信小程序异步处理详解
Nov 10 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
微信内置浏览器图片查看器的代码实例
Oct 08 Javascript
javascript实现用户必须勾选协议实例讲解
Mar 24 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
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
JavaScript中setInterval的用法总结
2013/11/20 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
python中for用来遍历range函数的方法
2018/06/08 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
解决Django中多条件查询的问题
2019/07/18 Python
简单了解python变量的作用域
2019/07/30 Python
Python 变量的创建过程详解
2019/09/02 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
Python Django view 两种return的实现方式
2020/03/16 Python
浅谈Python中的继承
2020/06/19 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
精灵市场:Pixie Market
2019/06/18 全球购物
公司委托书格式范文
2014/04/04 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
学生评语集锦
2015/01/04 职场文书
市场总监岗位职责
2015/02/11 职场文书
大专护理专业自荐信
2015/03/25 职场文书
小程序自定义轮播图圆点组件
2022/06/25 Javascript