详解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 写类方式之三
Jul 05 Javascript
Knockoutjs快速入门(经典)
Dec 24 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
Jul 27 Javascript
js变形金刚文字特效代码分享
Aug 20 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
微信小程序(三):网络请求
Jan 13 Javascript
基于JS实现移动端左滑删除功能
Jul 28 Javascript
浅谈Angular2 模块懒加载的方法
Oct 04 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
vue 循环加载数据并获取第一条记录的方法
Sep 26 Javascript
深入了解JavaScript代码覆盖
Jun 13 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 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 远程图片保存到本地的函数类
2008/12/08 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python实现彩色图转换成灰度图
2019/01/15 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
Python socket服务常用操作代码实例
2020/06/22 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
一套Delphi的笔试题二
2013/05/11 面试题
公司年会晚宴演讲稿
2014/01/06 职场文书
简短证婚人证婚词
2014/01/09 职场文书
新党章的学习心得体会
2014/11/07 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
道歉的话语大全
2015/05/12 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
七个非常实用的Python工具包总结
2021/06/15 Python