- 浏览: 782357 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (360)
- Java (101)
- JPA/Hibernate (10)
- Spring (14)
- Flex/BlazeDS (37)
- Database (30)
- Lucene/Solr/Nutch (0)
- Maven/Ant (25)
- CXF/WebService (3)
- RPC/RMI/SOAP/WSDL (1)
- REST (6)
- TDD/BDD/JUnit (1)
- Servlet/JSP (2)
- AI/MachineLearning (3)
- Resource (1)
- 字符编码 (2)
- OOA/OOPS/UML (5)
- DesignPattern (8)
- 算法与数据结构 (11)
- Web&App Server (13)
- 并发&异步&无阻塞 (7)
- Entertainment (4)
- JavaScript/ExtJS (45)
- CodeStyle&Quality (1)
- svn/git/perforce (8)
- JSON (2)
- JavaScriptTesting (4)
- Others (6)
- RegularExpression (2)
- Linux/Windows (12)
- Protocal (2)
- Celebrities (1)
- Interview (1)
- 计算机语言 (1)
- English (2)
- Eclipse (5)
- TimeZone/时区 (1)
- Finance (1)
- 信息安全 (1)
- JMS/MQ (2)
- XSD/XML/DTD (3)
- Android (4)
- 投资 (3)
- Distribution (3)
- Excel (1)
最新评论
-
qdujunjie:
如果把m换成具体的数字,比如4或者5,会让读者更明白
m阶B树中“阶”的含义 -
java-admin:
不错,加油,多写点文章
关于Extjs的mixins和plugin -
xiehuaidong880827:
你好,我用sencha cmd打包完本地工程后,把app.js ...
ExtJS使用Sencha Cmd合并javascript文件为一个文件 -
KIWIFLY:
lwpan 写道inverse = "true&qu ...
Hibernate中什么时候使用inverse=true -
luedipiaofeng:
good
消除IE stop running this script弹出框
问题描述和分析:
最近用ExtJS开发的代码在IE8里面跑时, IE跳出了stop running this script的提示, 提示如下:
Stop running this script?
A script on this page is causing your web browser to run slowly. If it continues to run, your computer might become unresponsive.
当然有些提示可能如下:
A script on this page is causing Internet Explorer to run slowly. If it continues to run, your computer may become unresponsive. Do you want to abort the script?
你可以点击"YES"或"NO",点击"NO",IE会继续执行脚本,执行结果跟没有弹出这个框的结果是一样的,点击"YES", IE停止执行脚本,这时候看到状态肯定是不正常的,如果用户都理解原理,并且每次都选择"NO",那么我们就不需要做任何修改了. 但这肯定是不可能的.
咋一看时, 以为肯定是程序的性能慢得IE自己都受不了了,所以跳个框出来,希望用户手动停止, 我的第一反映当然也是这样. 但是奇怪的是我在一台运行速度很快的电脑上, 2秒左右IE也跳出了这个信息, 这就让我困惑不已了,虽然2秒不算短,但是基于web技术的程序代码执行时间超过2秒的应该是可以接受的, 于是google了一下, 看到IE support team 提出的一个解决方案, 参考链接为:http://support.microsoft.com/kb/175500,
里面明确解析如下:
As of Internet Explorer 4.0 and later versions, the time-out is no longer a fixed value based on Windows messages. Internet Explorer now tracks the total number of executed script statements and resets the value each time that a new script execution is started, such as from a timeout or from an event handler, for the current page with the script engine. Internet Explorer displays a "long-running script" dialog box when that value is over a threshold amount. Internet Explorer doesn’t check on each instruction to see if it is over the limit. Periodically the script engine polls Internet Explorer with the number of statements executed and Internet Explorer checks if that is over the limit. Because of this mechanism, it is possible to execute more than the default limit without the dialog if the entire script execution finishes before the script engine polls Internet Explorer.
大致意思是: 从IE4.0的版本开始, 这个'long-running script'的弹出框其实并不是由于你的代码执行的时间超过了一个预先设定的值,而是周期性的检查IE执行的代码总行数是否超过了一个预设的值(这个值可以通过注册表修改),如果超过了就会弹出上面所说的框.
这个设计相当有意思,意味着就算你的代码在1秒钟内执行完成了,但是如果这1秒钟之类执行过的语句行数超过了这个预设的固定值,IE还是会弹出这个stop running script的框,这显然会让我们很困惑. 因为速度这么快,还跳出了这个框,难道要我们的代码不耗时间?
说实话,我看完这段解释后,还是不愿意接受这个观点, 只好自己实验一把了.
实验一,本实验代码会跳出stop running this script框,代码如下:
<html> <head> <title>IE Long Running Script Issue</title> </head> <body> Statements Execution Number: <span id='outputTxt'>0</span> <script type='text/javascript'> function exceedExectutionStatmentsLimit(){ var i=0, str='', output=document.getElementById('outputTxt'); for(; i<5000000; i++){ str=str+i; if(i % 100000 ===0){ output.innerHTML=i; } } output.innerHTML=i; } exceedExectutionStatmentsLimit(); </script> </body> </html>
用IE打开上面的html页面,会跳出stop...的框,选择yes后,页面输出为
Statements Execution Number: 1700000
这里暂时不解释这个输出,下面会有解释
实验二,本实验IE不会跳出stop running this script框,虽然本代码的执行时间超过了上面的代码
<html> <head> <title>IE Long Running Script Issue</title> </head> <body> Statements Execution Number: <span id='outputTxt'>0</span> <script type='text/javascript'> function AvoidLongRunningScriptMessageDisplay(){ var i=0, str='', output=document.getElementById('outputTxt'); (function () { for (; i < 9000000; i++) { str+=i; // Every 100,000 iterations, take a break if (i % 100000 == 0) { output.innerHTML=i; // Manually increment `i` because we break i++; // Set a timer for the next iteration window.setTimeout(arguments.callee); break; } } })(); } AvoidLongRunningScriptMessageDisplay(); </script> </body> </html>
页面输出为Statements Execution Number: 8900000
所以至少得出一个结论,IE官方的解释的确是言行一致,弹出框的跳出只与执行过的代码总行数有关,与其执行耗费的时间无关.
那么接下来有两个问题:
1)代码执行行数的限制是多少;
代码执行行数的限制是多少, 这个值是在注册表里面可修改的,默认是500万行, 当然你可以修改成更大,这样你也能阻止IE跳出stop running this script框,但显然
你只能解决你的IE,其他人的电脑注册表没修改过的话,还是会跳出来的,所以这个方案并不好.关于如何修改本文开头的解决方案3)已经给出了答案.
另外需要注意的是,事实上IE不会每执行一条语句就会检查是否总共执行过的代码行数是否超出了限制,这样显然很耗性能也不明智,IE会周期性的去检查,所以如果你
碰巧在IE来检查时没有超过限制,而不检查时超过了限制,你也不会看到stop script弹出框,当然这就跟中奖一样,看你运气了.
2)代码执行的总行数是怎么计算的;
a) 使用setTimeout调用的函数, 函数里面的代码使用的是一个新的计数器
b) 事件处理函数理的代码使用的也是一个新的计算器
c) 除此之外使用的是同一个计数器,很显然,如果你的代码既没有setTimeout也没有是用
event handler,那么很容易让计数器超过阀值
另外实验一中点了yes后,为什么输出的是Statements Execution Number: 1700000, 而不是500万呢,那是因为for循环了还有其他的代码,输出的是170万,
但是实际执行的已经有500万了.
如果你还是不相信上面的结论,那么可以用简单的方式,用程序生成500万行左右的javascript语句,看看是否真是500万行会跳出框,我给出了java代码的实现,
有兴趣你可以试一下,但提前预告一些,如果你生成了500万行语句,整个html文件大概有80M大,请做好心理准备,只怕目前你还没有运行过如此大的网页,你的IE
很容易死掉,电脑也可能会变慢,另外下面代码使用的是jdk1.7,
import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class GenerateJavascriptCodeForTesting { public static void main(String[] args) { Path outPut=Paths.get("c:\\tmp\\jsTest.html"); List<String> content = new ArrayList<String>(); content.add("<html><head><title>IE Long Running Script Issue</title></head><body><span id='outputTxt'>0</span><script type='text/javascript'>"); content.add("function exceedExectutionStatmentsLimit(){var i=0, str='', output=document.getElementById('outputTxt');"); int i=0; for(;i<6000000;i++){//try 4000000, 5000000, 6000000 and see whether the stop running script message will be shown up content.add("str+="+i+";"); if(i%100000==0){ content.add("output.innerHTML="+i+";"); } } content.add("output.innerHTML="+i+";}"); content.add("exceedExectutionStatmentsLimit();"); content.add("</script></body></html>"); try { Files.write(outPut, content, Charset.forName("UTF-8")); } catch (IOException e) { e.printStackTrace(); } } }
解决方案:
首先特别提出一点, 触发事件并执行事件处理函数是一个同步过程,不是异步过程. 可以参考我的另一篇文章:http://darrenzhu.iteye.com/blog/2029822
1. setTimeout
使用setTimeout将大量代码分开执行,每个setTimeout会使用一个新的代码行数计数器,这样你的代码就会减少弹出"Stop running script ..."窗口的机会. 当然很多时候,我们并不会碰到该问题,毕竟500万行代码不是个小数目,不过程序命中的概率比你中500万的彩票显然要容易得多.
2. 通过事件
把你的代码放到事件处理函数里面, 当然事件可以是系统的事件如mouseover, click, 也可以是你自定义和手动触发的. 事件机制为什么能解决这个问题,是因为IE的代码计数器对事件处理函数里面的代码重新计数,已经跟当前控制流的代码计数器分开了.
我更倾向于用事件机制来解决, 因为用setTimeout,你必须指定一个时间,时间设置得不管有多么短,都会有延迟,而事件不会有延迟,当你触发了事件,立马会去执行事件处理函数.
3. 修改注册表, 至于为什么可以通过修改注册表解决这个问题,请看下文的解释
要修改IE4 - IE8的time-out的值,按如下方式操作:
1)运行Regedit32.exe, 找到下面这一项
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Styles
如果Styles这一项不存在, 你可以创建这一个项
2)创建一个类型为DWORD的键值"MaxScriptStatements", 并且设置它的值为你需要的脚本代码总函数, 如果你不知道设置多少合适, 你可以将其设置成0xFFFFFFFF, 这样就可以避免IE弹出"Stop running Script ..."的框.
默认Styles这一项是不存在的, 这个时候默认的弹出time-out框的代码总函数限制是500万行, 当然是针对IE4 - IE8来说.
发表评论
-
Fiddler使用
2017-06-22 16:27 569Fiddler不能捕获chrome request 原因是,c ... -
Javascript跨域
2017-06-21 17:05 568在js中,我们直接用XMLHttpRequest请求不同域上 ... -
面向对象的JavaScript,ECMAScript6, ECMAScript2015
2017-02-11 21:11 521全面理解面向对象的 JavaScript http://www ... -
SASS用法指南
2016-03-03 14:18 648SASS用法指南 http://www.ruanyifeng. ... -
Angular JS与ExtJS比较
2016-01-04 13:54 1572ExtJS vs AngularJS http://www.t ... -
ExtJS POST请求客户端服务端案例
2015-11-10 15:29 1151客户端GUI端示例 var positionIDList = ... -
Javascript设计模式
2015-09-29 14:12 778书名:Learning JavaScript Design P ... -
JavaScript单例模式Singleton Pattern
2015-09-29 14:10 1315参考链接:http://www.dofactory.com/j ... -
Check scope of element in Angular JS
2015-06-16 15:36 715step 1) choose an element in de ... -
有意思的HTML5效果
2015-03-18 09:24 1196http://www.html5tricks.com/9-fu ... -
JavaScript内存溢出
2015-02-13 10:42 1034http://javascript.info/tutorial ... -
JavaScript Variable Scope and Closure(闭包)
2015-02-11 09:52 881参考文章: http://javascript.info/tu ... -
JavaScript电子相册
2015-02-05 09:36 1758http://www.webhek.com/misc/3d-a ... -
JavaScript学习笔记
2015-01-11 10:59 768Repeated and Omitted Declaratio ... -
JavaScript小技巧
2014-12-26 10:00 844关系javascript变量的内存 ... -
JavaScript TimeZone issue
2014-10-31 11:48 0Tue Jan 01 2008 23:45:00 GMT+03 ... -
转义字符处理,获取字符的ASCII码值
2014-10-24 13:58 1962Java 获取字符的ASCII码值 int asciiDec ... -
JavaScript技巧,最佳实践(Best Practice)
2014-10-20 10:03 64545个实用的JavaScript技巧、窍门和最佳实践 http ... -
如何跨域获取Cookie
2014-06-23 14:32 3069cookie可以跨子域访问,如果用户信息保存在qq.com的c ... -
JavaScript获取图片(Image)的大小(宽度,高度)
2014-05-13 17:46 1797如果只有图片的URL function getImageD ...
相关推荐
供大家参考,具体内容如下 根据传入的type来判断是确认框或提示框 <template> <transition name="confirm-fade"> <div v-if="isShowConfirm" class="my-confirm" @click.stop="clickFun('clickCancel')"> ...
-w|--chdir <dir> change the work directory to 'dir' -u|--user |<uid> stop processes owned by this user -n|--name <process-name> stop processes with this name -s|--signal <signal> signal to send ...
报错是因为虚拟机的磁盘用完了,想要正常启动需要进入recovery模式,进去把不需要的文件删除,然后才你那个正常启动。 1.重启Ubuntu,随机长按shift进入grub菜单,或等待grub菜单出现 2.选择Advanced options for ...
DataNitro是一款能在Excel中运行Python脚本的插件。...Stops a running script. Docs This links to the documentation. Add-ins This links to our contact information. Settings Modify DataNitro's settings.
上传资源的目的是因为之前下载的ThrottleStop8.40版本过期了(打开后提示This beta version has now expired.),内网也没有新版,寻找到这个最新版本,上传后以便大家使用。 保证原版资源无任何修改添加。 throttle...
交通标志stop数据集stop_traffic_data.rar,包含标签
Look ‘n’ Stop Firewall 2.07 Crack for Win7 Rate This Look ‘n’ Stop Firewall 被誉为全球最牛X的防火墙,功能强大,在同类产品中评测第一。体积小巧,占用内存小。XP下网上已提供注册机,但在WIN7下无法...
ThrottleStop_9.5 笔记本处理器intel超频软件
上传资源的目的是因为之前下载的ThrottleStop8.10beta2版本过期了(打开后提示This beta version has now expired.),内网也没有新版,寻找到这个最新版本,上传后以便大家使用。 throttlestop是款防cpu降频软件。...
ThrottleStop 免费版,尽情使用,永不过期!ThrottleStop 让电脑为性能发烧锁定主频,气绝降频,更可以调节至尊系列处理器的倍频、电压、外频,ThrottleStop 在手,强悍恒持久!
throttlestop是电脑cpu性能检测软件。throttlestop主要是为用户实时监测cpu运行性能,并解决笔记玩游戏时温度一高就降频运行迟钝歇菜难题,让玩家能尽情畅玩游戏。 throttlestop功能介绍: 1、用于笔记本调节cpu; 2...
ThrottleStop8.48是当前最新版本,可以解决8.40版本在使用时提示This beta version has now expired的问题。throttlestop用于防止cpu降频运行,解决电脑cpu达不到最高性能的问题。现在的CPU很智能化,当温度...
ThrottleStop是一款能让你的Intel Core i或者Core 2处理器运行更为流畅的应用程序。此程序提供4种预设配置文件,提高你电脑运行的体验。 “Performance”模式可以提高一般性能,“Game”模式可为游戏者完善功能,...
在很多低功耗应用中都需将 MCU 进入 STOP MODE 以节省更多的功耗,但是在以前的架构中,如 果要达到这种应用,只能在进入低功耗模式之前将串口的管脚设置成普通的 GPIO 的中断模式,虽然也可 以达到效果,但是这样会丢失...
init:rcS post-stop process(1160) init:rcS post-stop process(923)
This shows how to count off time in a Stop Watch format.
CODESYS运动控制之MC_Stop 1:在《CODESYS运动控制之MC_MoveVelocity》程序的基础上,增加新功能块MC_Stop,用来实现轴的停止。 1.1程序中新添加功能块MC_Stop,对其变量自动声明。之后关联轴并对轴减速做相关设定。
免除硬超烦恼,好评如潮的软超软件。Throttlestop_CPU鸡血
用c++ 定义一个车(Vehicle)基类,有Run,Stop等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类,从bicycle和 motorcar派生出摩托车(motorcycle)类,他们都有Run,Stop等成员函数。编写完整并用主函数测试...
顶级look n stop 防火墙,带有注册机及汉化语言包