详解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 相关文章推荐
JS根据变量保存方法名并执行方法示例
Apr 04 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
Bootstrap基本样式学习笔记之表单(3)
Dec 07 Javascript
简单理解js的冒泡排序
Dec 19 Javascript
JS实现的验证身份证及获取地区功能示例
Jan 16 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
May 09 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
May 18 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
vue微信分享的实现(在当前页面分享其他页面)
Apr 16 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多态的实现详解
2013/06/09 PHP
浅析is_writable的php实现
2013/06/18 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
python+opencv实现动态物体追踪
2018/01/09 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
什么是聚集索引和非聚集索引
2012/01/17 面试题
化工专业推荐信范文
2013/11/28 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技