详解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 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
Jquery中dialog属性小记
Sep 03 Javascript
IE6 hack for js 集锦
Sep 23 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
Jun 22 Javascript
JS产生随机数的用法小结
Dec 10 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
Apr 21 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
分享vue.js devtools遇到一系列问题
Oct 24 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
Nov 15 Javascript
快速搭建vue2.0+boostrap项目的方法
Apr 09 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
Sep 01 Javascript
laydate时间日历插件使用方法详解
Nov 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遍历数组的方法分享
2012/03/22 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
javascript 写类方式之四
2009/07/05 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
vue.js计算属性computed用法实例分析
2018/07/06 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
JS函数基本定义与用法示例
2020/01/15 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
Python调用C语言的实现
2019/07/26 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
三星英国官网:Samsung英国
2018/09/25 全球购物
机电专业大学生职业规划书范文
2014/02/25 职场文书
党员公开承诺书
2014/03/25 职场文书
最常使用的求职信
2014/05/25 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
陪护人员误工证明
2015/06/24 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python