详解maxlength属性在textarea里奇怪的表现


Posted in Javascript onDecember 27, 2015

HTML5给表单带来了很多改变,比如今天要说的maxlength,这个属性可以限制输入框输入的最大字字符数,更方便的是对于粘贴的内容也能够根据字符数自动截断。

最近就接到这要一个需求,限制用户最多输入600字(汉字和字母不区分),对于粘贴的内容也要能自动截断,输入600字后就无法输入。

第一时间想到了maxlength,基本满足需求,但还是有一些怪异的表现。

看下面的代码:

<textarea name="text" id="text" maxlength="600"></textarea>
<p><span id="already"></span>/<span>600</span></p>
text.oninput = function() {
  already.textContent = text.value.length;
}

上述代码中限制输入字符数为600,并通过oninput监听用户的输入,没有用keydown,因为keydown只能监听用户键盘输入,对于粘贴没有反应。。。oninput可以做到。

这时候直接输入600字后就不再可以输入,删除一些,再输入一些,表现正常。奇怪的是如果你粘贴进textarea里一大堆文字,以为maxlength的存在自动截断,此时textarea里正好有600个字符,这时候你删除一些字符,然后再尝试输入,你会发现:

卧槽,无法输入了!!!再删的多一些,这时可以继续输入,但是!!!在输入还不到600字符的时候,突然又不能输入了!!!

chrome下以及我的android机器下都会这样。。暂时不知道原因。测试了下input,不会有这样的情况出现,而且maxlength属性的值小一点的话就不会有这种情况,比如10。。。

这样的话maxlength就不靠谱了,就自己多写点代码吧,既然oninput这么灵活,就用它了。

修改下代码,去掉textarea的maxlength属性,使用input监听textarea的value值,超过600就自动截断,造成一种无法输入的错觉。

text.oninput = function() {
  if(text.value.length >= 600) {
    text.value = text.value.substr(0,600);
  }
  already.textContent = text.value.length;
}

不放心的话,可以继续监听keydown事件,在输入大于600字符后阻止默认事件,但是有几个键是不能禁止的:删除退格和回车:

text.onkeydown = function() {
  if(text.value.length >= 600) {
    // 删除:46 退格:8 回车:13
    if (!(e.which == '46' || e.which == '8' || e.which == '13')) {
      e.preventDefault();
    }
   }
}

IE8以下不支持maxlength属性,也不支持oninput,但是他们有一个更强大的方法:onpropertychange。

下面通过一端代码讲解textarea实现maxlength属性

<script language="javascript" type="text/javascript"> 
function textlen(x,y){ 
 var thelength = x.value.length; 
 window.status=thelength+' of '+y+' maximum characters.'; 
} 
function maxtext(x,y){ 
 tempstr = x.value 
 if(tempstr.length>y){ 
  x.value = tempstr.substring(0,y); 
 } 
 textlen(x,y); 
} 
</script> 
<form name="myform"> 
   <textarea name="mytextarea"  
              cols="45"  
              rows="3"  
              wrap="virtual"  
              onkeypress="return(this.value.length<20)" 
              onkeydown="textlen(this,20)"  
              onkeyup="textlen(this,20)"  
              onblur="maxtext(this,20)">
   </textarea> 
</form>
Javascript 相关文章推荐
extjs 为某个事件设置拦截器
Jan 15 Javascript
优化innerHTML操作(提高代码执行效率)
Aug 20 Javascript
原生JavaScript实现合并多个数组示例
Sep 21 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
jQuery操作cookie
Aug 08 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
js如何获取网页所有图片
May 12 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
Sep 21 Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 Javascript
浅谈Vue的响应式原理
May 30 Javascript
vue 获取url参数、get参数返回数组的操作
Nov 12 Javascript
vue实力踩坑之push当前页无效
Apr 10 Vue.js
SublimeText自带格式化代码功能之reindent
Dec 27 #Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 #Javascript
JavaScript的removeChild()函数用法详解
Dec 27 #Javascript
JavaScript构造函数详解
Dec 27 #Javascript
JavaScript生成二维码图片小结
Dec 27 #Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 #Javascript
Knockout自定义绑定创建方法
Dec 26 #Javascript
You might like
JAVA/JSP学习系列之四
2006/10/09 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
微信小程序 POST请求的实例详解
2017/09/29 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
Vue axios设置访问基础路径方法
2018/09/19 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
一篇文章快速了解Python的GIL
2018/01/12 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
培训班开班仪式主持词
2014/03/28 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
2014年商场工作总结
2014/11/22 职场文书
python数据处理之Pandas类型转换
2022/04/28 Python