关于JavaScript限制字数的输入框的那些事


Posted in Javascript onAugust 14, 2016

前言

最近产品需要做不少输入框,产品想要的交互效果是:用户可以输入中英文,随着用户输入能实时显示已经输入的字符个数,当超过数量限制时输入框边框变红,同时给用户提示信息。

这交互听起来没啥问题,技术实现上似乎也没啥难点。但是当我实现出来以后遇到中文输入法就有坑了。

怎么个坑呢,且看下文~~

实时监测输入框内容长度所遇到的坑使用 oninput事件来监听

使用这个oninput事件的好处有2个:

当用户通过右键复制改变输入框内容时,可以监听到;

只有在输入框内容发生变化时才会触发此事件,比如用户按下方向键、control/shift 等这些控制字符键时此事件是不会触发的;

当你输入英文字符或者数字时效果完美,甚至在你正常输入中文时也效果完美。但当你非正常输入中文时就出现 bug 了。非正常输入是怎样的呢?看下面这张示例图:
关于JavaScript限制字数的输入框的那些事

看到了吗,在这种中文输入方式下,其实用户还没有输入他想输入的中文,只是输入了几个拼音,但 input 事件被触发了,而且监听到的输入框value居然是d'd'd,不单单是拼音字符,还包括了分隔的点。假如输入框内容长度被限制为不超过5,那么在截图这种情况下,就会提示用户字符长度超过限制!。这样的交互效果当然不是产品想要的。

使用onkeydown/onkeypress/onkeyup事件来监听

这几个事件的缺点是无法监听右键复制而来的输入内容,但是否也会存在与input事件一样的问题呢?

我做了几个实验,发现keydownkeyup都会遇到和 input一样的问题,但keypress没有这个问题,因为在中文输入状态下,keypress不会触发,不单是你输入拼音的过程中不会触发,等你选中所要输入的中文如“对对对”后也不会触发。那么当输入“对对对”后虽然超过了字符限制但无法给出字符长度超过限制!的提示。

折中解决方法

要想做到实时监测内容长度,又想保证中文输入法状态下没有 bug,我折腾了好久最后发现 臣妾做不到呀!(要是哪位豪杰找到了,一定要告诉我呀~~)。

所以最后牺牲了下用户体验,找到了一个折中的方式:输入框失去焦点时(即blur),或者用户输入回车键时才进行内容长度的检测。当然如果发现输入框内容超过限制,要将光标停留在输入框内,方便用户进行修改。

哎,一说到用户输入回车键时才进行内容长度的检测又得说说以前栽的坑了

输入框中如何检测输入了回车键

其实这是一个很常见的交互,比如修改名称时支持用户输入回车后直接保存、登录时支持用户输入回车后直接登录。但其中要小心的坑是:**中文输入法下按回车键来输入英文字符**

中文输入法下按回车键来输入英文字符的过程举例:

比如我要输入账号进行登录,我的账号是全英文的,我当前处于中文输入法,但我懒得切换输入法,于是我就直接敲了我的账号(全英文字符),这时搜狗输入法给我提示了一大串中文,然后我按了个回车,输入框就输入了我想要的英文字符。

在这种情况下,用户虽然输入了回车键,但用户按下回车键只是想在中文输入法下输入英文字符而已,这个回车键并不是我们想要监听的回车键。那么怎么排除这种情况下的回车键呢?

一般来说监听回车键我们会用keydown事件或者keyup事件,实现代码如下所示。那么是否这两种方法都能过滤掉我们不想监听的回车键呢?

//方法一:使用 keydown 事件
input.onkeydown = function(e){
 if(e.keyCode == 13){
  //用户输入的是回车键
  //做相关操作
 }
}
//方法二:使用 keyup 事件
input.onkeyup = function(e){
 if(e.keyCode == 13){
  //用户输入的是回车键
  //做相关操作
 }
}

经过试验发现:使用keydown是可以成功过滤的,但使用keyup不能。

那么我们来看看为什么?

是因为在keydown事件中:中文输入法状态下输入的回车键,检测的 keyCode229 而不是13;单纯输入一个回车时,keyCode才是13

而在keyup事件中:中文输入法状态下输入的回车键,检测的 keyCode13;单纯输入一个回车时,keyCode也是13

下图是我打印在 console 中的结果:(代码示例见这里)

关于JavaScript限制字数的输入框的那些事

结语

关于输入框涉及到的几个事件:keydown/keyup/keypress/input/change

查看这里:https://3water.com/article/21237.htm

Javascript 相关文章推荐
js 操作符汇总
Nov 08 Javascript
javascript闭包的理解
Apr 01 Javascript
JavaScript实现定时隐藏与显示图片的方法
Aug 06 Javascript
使用jquery动态加载Js文件和Css文件
Oct 24 Javascript
JS数组排序方法实例分析
Dec 16 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
微信小程序返回多级页面的实现方法
Oct 27 Javascript
详解webpack提取第三方库的正确姿势
Dec 22 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
微信小程序中时间戳和日期的相互转换问题
Jul 09 Javascript
详解微信小程序的 request 封装示例
Aug 21 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
使用ajaxfileupload.js实现上传文件功能
Aug 13 #Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 #Javascript
漂亮! js实现颜色渐变效果
Aug 12 #Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 #Javascript
jquery表格datatables实例解析 直接加载和延迟加载
Aug 12 #Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 #Javascript
Javascript中的对象和原型(二)
Aug 12 #Javascript
You might like
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
在漏洞利用Python代码真的很爽
2007/08/26 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
Python模块 _winreg操作注册表
2020/02/05 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
中专生自我鉴定范文
2014/02/02 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
英文演讲稿
2014/05/15 职场文书
2014年班级工作总结
2014/11/14 职场文书
大学教师个人总结
2015/02/10 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS