详解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 相关文章推荐
Extjs在exlipse中设置自动提示的方法
Apr 07 Javascript
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
jquery 实现表单验证功能代码(简洁)
Jul 03 Javascript
jquery.validate的使用说明介绍
Nov 12 Javascript
javascript学习笔记之10个原生技巧
May 21 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
深入理解Angular4中的依赖注入
Jun 07 Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 Javascript
js之切换全屏和退出全屏实现代码实例
Sep 09 Javascript
Jquery滑动门/tab切换实现方法完整示例
Jun 05 jQuery
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获取指定范围内最接近数的方法
2015/06/02 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
Python字符串处理实例详解
2017/05/18 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python微信撤回监测代码
2019/04/29 Python
python统计字符的个数代码实例
2020/02/07 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Python自动化操作实现图例绘制
2020/07/09 Python
python中的时区问题
2021/01/14 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
驾驶员岗位职责
2014/01/29 职场文书
小班开学寄语
2014/04/04 职场文书
爱耳日活动总结
2014/04/30 职场文书
小班下学期评语
2014/05/04 职场文书