详解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 相关文章推荐
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
jquery使用append(content)方法注意事项分享
Jan 06 Javascript
javascript实现2048游戏示例
May 04 Javascript
JS随机打乱数组的方法小结
Jun 22 Javascript
vue2.0+webpack环境的构造过程
Nov 08 Javascript
详解vue的数据binding绑定原理
Apr 12 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
Apr 24 jQuery
详解webpack loader和plugin编写
Oct 12 Javascript
js实现一个页面多个倒计时的3种方法
Feb 25 Javascript
JS实现简易留言板特效
Dec 23 Javascript
微信小程序实现文件预览
Oct 22 Javascript
js实现自定义滚动条的示例
Oct 27 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
如何选购合适的收音机
2021/03/01 无线电
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
JQuery里选择超链接的实现代码
2011/05/22 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
python实现两个文件夹的同步
2019/08/29 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
公司出纳岗位职责
2013/12/07 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
幼儿园安全责任书
2014/04/14 职场文书
《开国大典》教学反思
2014/04/19 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
跑吧孩子观后感
2015/06/10 职场文书
酒店宣传语大全
2015/07/13 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB