zoukankan      html  css  js  c++  java
  • 详解maxlength属性在textarea里奇怪的表现

    这篇文章主要介绍了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>
  • 相关阅读:
    高德全链路压测平台TestPG的架构与实践
    性能测试之稳定性测试(可靠性测试)
    服务端高并发分布式架构演进之路
    高性能高并发系统的稳定性保障
    聊聊服务稳定性保障这些事
    qt 待研究
    k73 uboot 和emmc启动移植
    Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
    C++ Lambda 编译器实现原理
    qt 网络编程参考资料
  • 原文地址:https://www.cnblogs.com/my--sunshine/p/7058432.html
Copyright © 2011-2022 走看看