关于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 判断 enter 事件
Feb 12 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
Oct 12 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
Feb 02 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
Jun 05 Javascript
Javascript编程中几种继承方式比较分析
Nov 28 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
Apr 26 Javascript
vue 组件间的通信之子组件向父组件传值的方式
Jul 29 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 基本语法格式
2009/12/15 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
ArrayList类(增强版)
2007/04/04 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
法学专业本科生自荐信范文
2013/12/17 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
服务承诺书怎么写
2014/05/24 职场文书
预防煤气中毒方案
2014/06/16 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL