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

 更新时间:2015年12月27日 10:50:11   作者:zjzhome  
这篇文章主要介绍了maxlength属性在textarea里奇怪的表现的相关资料,需要的朋友可以参考下

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 10件让人费解的事情

    JavaScript 10件让人费解的事情

    JavaScript 可算是世界上最流行的编程语言,它曾被 Web 开发设计师贴上噩梦的标签,虽然真正的噩梦其实是 DOM API,这个被大量的开发与设计师随手拈来增强他们的 Web 前端的脚本语言,如今越来越被重视,虽则如此,JavaScript 仍然拥有很多让人费解的东西。
    2010-02-02
  • layui form表单提交后实现自动刷新

    layui form表单提交后实现自动刷新

    今天小编就为大家分享一篇layui form表单提交后实现自动刷新,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • 正则表达式删除JavaScript代码中的空格、注释和换行符

    正则表达式删除JavaScript代码中的空格、注释和换行符

    这篇文章主要介绍了正则表达式删除JavaScript代码中的空格、注释和换行符,需要的朋友可以参考下
    2023-12-12
  • js prototype和__proto__的关系是什么

    js prototype和__proto__的关系是什么

    这篇文章主要介绍了js prototype和__proto__的关系是什么,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • JS获取浏览器版本及名称实现函数

    JS获取浏览器版本及名称实现函数

    获取浏览器名称及版本信息,如果当前浏览器是IE,弹出浏览器版本,否则弹出当前浏览器名称和版本,详细实现代码请参考本文
    2013-04-04
  • Bootstrap项目实战之子栏目资讯内容

    Bootstrap项目实战之子栏目资讯内容

    Bootstrap项目实战之资讯内容,本文主要学习制作一下子栏目资讯内容,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 基于canvas的二维码邀请函生成插件

    基于canvas的二维码邀请函生成插件

    本文主要介绍了基于canvas的二维码邀请函生成插件。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • JavaScript 随机验证码的生成实例代码

    JavaScript 随机验证码的生成实例代码

    这篇文章主要介绍了JavaScript 随机验证码的生成实例代码的相关资料,需要的朋友可以参考下
    2016-09-09
  • JavaScript实现图片放大预览效果

    JavaScript实现图片放大预览效果

    这篇文章主要介绍了JavaScript实现图片放大预览效果,帮助大家更好的理解和制作JavaScript特效,感兴趣的朋友可以了解下
    2020-11-11
  • webpack打包主要流程以及优化

    webpack打包主要流程以及优化

    这篇文章主要介绍了Webpack是一个强大的前端构建工具,通过配置文件和一系列的插件和加载器,它可以将项目中的模块打包成适合生产环境的文件,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01

最新评论