详解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实例教程(19) 使用HoTMetal(7)
Dec 23 Javascript
JavaScript语句可以不以;结尾的烦恼
Mar 08 Javascript
js 页面执行时间计算代码
Mar 04 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
Dec 31 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
websocket+node.js实现实时聊天系统问题咨询
May 17 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
Sep 25 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
人族 TERRAN 概述
2020/03/14 星际争霸
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
Python微信库:itchat的用法详解
2017/08/14 Python
python reduce 函数使用详解
2017/12/05 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
《李广射虎》教学反思
2014/04/27 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
节约用电倡议书
2015/04/28 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python