详解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 相关文章推荐
Javascript学习笔记二 之 变量
Dec 15 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
js 高效去除数组重复元素示例代码
Dec 19 Javascript
javascript计算星座属相(十二生肖属相)示例代码
Jan 09 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 Javascript
Bootstrap零基础入门教程(二)
Jul 18 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
Jun 14 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
Aug 24 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
js实现删除li标签一行内容
Apr 16 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 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
综合图片计数器
2006/10/09 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
js下用gb2312编码解码实现方法
2009/12/31 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
JsRender for object语法简介
2014/10/31 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
python中的编码知识整理汇总
2016/01/26 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
Python 硬币兑换问题
2019/07/29 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
《蓝色的树叶》教学反思
2014/02/24 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
Java获取字符串编码格式实现思路
2022/09/23 Java/Android