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

本文探讨了HTML5中maxlength属性在textarea元素上的行为表现,尤其是在字符限制及粘贴操作时的异常现象。文中提供了多种解决方法,包括使用JavaScript来替代原生属性实现更稳定的输入控制。

这篇文章主要介绍了maxlength属性在textarea里奇怪的表现的相关资料,需要的朋友可以参考下

 

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

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

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

看下面的代码:

?
1
2
3
4
5
<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就自动截断,造成一种无法输入的错觉。

?
1
2
3
4
5
6
text.oninput = function () {
   if (text.value.length >= 600) {
     text.value = text.value.substr(0,600);
   }
   already.textContent = text.value.length;
}

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

?
1
2
3
4
5
6
7
8
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属性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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>

 

转载于:https://www.cnblogs.com/my--sunshine/p/7058432.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值