详解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 相关文章推荐
jQuery 使用手册(三)
Sep 23 Javascript
点击文章内容处弹出页面代码
Oct 01 Javascript
javascript sudoku 数独智力游戏生成代码
Mar 27 Javascript
JavaScript中的变量作用域介绍
Dec 31 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
vue组件之Alert的实现代码
Oct 17 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
May 05 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
Js代码中的span拼接问题解决
Nov 22 Javascript
Vue项目打包编译优化方案
Sep 16 Javascript
element tree树形组件回显数据问题解决
Aug 14 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
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
PHP5.3新特性小结
2016/02/14 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
Python tcp传输代码实例解析
2020/03/18 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
2015年防汛工作总结
2015/05/15 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL
MySQL池化框架学习接池自定义
2022/07/23 MySQL