详解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 相关文章推荐
JavaScript 关键字屏蔽实现函数
Aug 02 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 Javascript
一起来写段JS drag拖动代码
Dec 09 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
关于Bootstrap按钮组件消除黄框的方法
May 19 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
vue组件编写之todolist组件实例详解
Jan 22 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
Jan 31 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
微信小程序实现banner图轮播效果
Jun 28 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
小程序实现密码输入框
Nov 16 Javascript
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
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
解密效果
2006/06/23 Javascript
js DOM模型操作
2009/12/28 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Python iter()函数用法实例分析
2018/03/17 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
简单了解Python生成器是什么
2019/07/02 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python ubplot使用方法解析
2020/01/10 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
django实现将后台model对象转换成json对象并传递给前端jquery
2020/03/16 Python
django创建css文件夹的具体方法
2020/07/31 Python
python 实现图片批量压缩的示例
2020/12/18 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
应届生.NET方向面试题
2015/05/23 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
物理研修随笔感言
2014/02/14 职场文书
阳光体育活动方案
2014/02/16 职场文书
元旦联欢会感言
2014/03/04 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
运动会加油稿30字
2015/07/21 职场文书
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
Nginx的gzip相关介绍
2022/05/11 Servers