详解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 相关文章推荐
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
javascript URL编码和解码使用说明
Apr 12 Javascript
基于jQuery的为attr添加id title等效果的实现代码
Apr 20 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
javascript实现tab切换的两个实例
Nov 05 Javascript
AngularJS向后端ASP.NET API控制器上传文件
Feb 03 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 Javascript
Angular6 写一个简单的Select组件示例
Aug 20 Javascript
Layui 数据表格批量删除和多条件搜索的实例
Sep 04 Javascript
基于Vue的商品主图放大镜方案详解
Sep 19 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
php获取网页内容方法总结
2008/12/04 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
2011/07/31 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python facenet进行人脸识别测试过程解析
2019/08/16 Python
python默认参数调用方法解析
2020/02/09 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
公司薪酬管理制度
2014/01/31 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
计划生育责任书
2015/05/09 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
导游词之井冈山
2019/11/20 职场文书
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫