情景是要限制一个textarea的最大输入字数(100字,  这字数限制也太少了点吧,不大气)

由于限制输入后需要允许 回退,全选等功能键,故放弃keyup, keydown组合

选用property 和 input事件, 由于ff 和 chrome支持maxlength,故这里就只为ie加事件处理

$addDescArea.on("propertychange", function (e) {

                if ($addDescArea.val().length >= 100) {
$addDescArea.val($addDescArea.val().substr(0, 100)); }
});

代码很简单,当>=100字时,截取前100个字符

但是在IE6/7 下会抛出如下异常

"Stack Overflow at line 0"

后来google之后,得到原因是触发了死循环

即:

$addDescArea.val($addDescArea.val().substr(0, 100));
上面代码中
$addDescArea.val 方法在反复的调用和递归,

于是我把代码改为
var text = $addDescArea.val();

if(text.length > 100)
{
$addDescArea.val(text.substr(0, 100))
}

把原始value存到一个变量里,但是错误依旧,

最后只能尝试 另外声明一个变量把当前的 value存放进去,然后再用这个新的变量赋值

 $addDescArea.on("propertychange", function (e) {
var areaText = $addDescArea.val(),
maxLength = parseInt(e.target.getAttribute("data-maxlength") || 100, 10),
cutText = areaText.substr(0, maxLength); if (areaText.length >= maxLength) {
$addDescArea.val(cutText);
}
});

最后个bug的根本原因是:

在IE6/7 上

var text = $addDescArea.val()

是指向栈中的一块大小为$addDescArea.val()的string类型的空间(称为x)

而$addDescArea.value(aa) 则是将x修改为aa, 并非新开一块大小为aa的栈空间

所以

$addDescArea.val($addDescArea.val().substr(0, 100));
是在循环递归的操作这同一块栈空间,导致发生死循环 解决方法就是将textArea.val() 拷贝一份然后再赋值,
areaText.substr(0, maxLength); 
此处的substr就是创建了一个新的string
												

IE 6/7下自赋值导致 overflow 溢出的更多相关文章

  1. ARC下的block导致的循环引用问题解析

    ARC下的block导致的循环引用问题解析 更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html ARC下,copy到堆上的blo ...

  2. [转载]linux下网卡漂移导致网络不可用

    转自:https://blog.csdn.net/hyatsz/article/details/47690993 linux下网卡漂移导致网络不可用 2015年08月16日 00:48:50 hyat ...

  3. Python_关于多线程下变量赋值取值的一点研究

    关于多线程下变量赋值取值的一点研究 by:授客 QQ:1033553122 1.代码实践1 #!/usr/bin/env python # -*- coding:utf-8 -*- __author_ ...

  4. 并发场景下HashMap死循环导致CPU100%的问题

    参考链接:并发场景下HashMap死循环导致CPU100%的问题

  5. IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  6. RB1001: IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  7. {前端CSS} 语法 Css的几种引入方式 css选择器 选择器的优先级 CSS属性相关 背景属性 边框 CSS盒子模型 清除浮动 overflow溢出属性  定位(position)z-index

    前端CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 当浏览器读到一个样式表,它就会按照这个样式表来对文 ...

  8. 图片--Android加载图片导致内存溢出(Out of Memory异常)

    Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证) ...

  9. POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

    1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...

随机推荐

  1. [ZZ]良好的编码习惯

    1.以简洁明了的方式编写C程序.通常把这种程序编写方法称为KIS(“保持简洁”).不要用古怪的方式编写程序. 2.阅读所有的C版本手册.经常参考所用的C版本的手册能了解该版本的丰富的特点,并正确地使用 ...

  2. REM 注释

    REM 是DOS批处理和VB的注释语句.所谓注释语句,就是程序的执行时会跳过该行(不管它后面写的什么),它为编程者起到一个批注的功能,以达到好的可读性以便于交流以及起到备忘作用. 在批处理命令中如果不 ...

  3. 如何打开“USB调试”模式?

    请首先确认您的系统版本, 点击「设置」-「关于手机」查看您当前的手机版本号. 如果您使用的是 Android 3.2及以下系统,请按以下步骤操作: STEP1:在应用列表选择「设置」进入系统设置菜单: ...

  4. Android市场官方的统计信息

    做Android应用和游戏,避免不了的要了解市面上的各种android设备的信息,以最大程度的兼容更多的设备. Android市场会定期发布统计信息,包括SDK版本,屏幕大小和分辨率,OpenGL E ...

  5. PHP加速器

    转http://www.vpser.net/opt/apc-eaccelerator-xcache.html 一.PHP加速器介绍         PHP加速器是一个为了提高PHP执行效率,从而缓存起 ...

  6. iOS 中的 block 是如何持有对象的

    Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法, ...

  7. 浅谈iOS中的视图优化

    引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...

  8. C语言枚举

    应该是 各种语言都支持枚举的. 所以这个 之前在我们java案例里面就出现过的季节代码再次出现了. 枚举帮我们起到一个变量值,在某一范围内的限定,用来避免一些非法值的键入. 值得注意的是,这里面的枚举 ...

  9. http请求之referer头与防盗链

    在网页中的占用大流量的信息可以写成这个信息在网络上的url位置,这样就会减少本网站的流量,但是其他网站也 不会随意让你使用人家的资源,因为这样的情对人家的网站没有好处,会增加人家网站的流量,所以要防止 ...

  10. Android调用.net的webservice服务器接收参数为空的情况

    问题描述:安卓开发中,用Android调用.net开发的wenService时候,从Android客户端传递参数到服务器端,服务器端接收为空 解决方法: 1.设置envelope.dotNet = t ...