Javascript 在chrome/safari中捕捉无限while循环
我编写了一个函数,用于在循环运行超过指定时间后捕获循环Javascript 在chrome/safari中捕捉无限while循环,javascript,google-chrome,safari,while-loop,Javascript,Google Chrome,Safari,While Loop,我编写了一个函数,用于在循环运行超过指定时间后捕获循环 var t1 = new Date().getTime(); while(true){ //general code in here... document.body.appendChild(document.createElement('div')); //This causes the problem if(isInfinite(t1,3000)){ alert('Loop stopped a
var t1 = new Date().getTime();
while(true){
//general code in here...
document.body.appendChild(document.createElement('div')); //This causes the problem
if(isInfinite(t1,3000)){
alert('Loop stopped after 3 seconds')
break;
}
}
function isInfinite(t1,timeLimit){
var t2 = new Date().getTime();
if(t2-t1> timeLimit){
return true;
}
else return false;
}
它按预期工作,但当我尝试将节点附加到文档中时,它无法在chrome&safari中捕获。
奇怪的是,当我运行调试器时,它就工作了,而且它在FF中工作。这是什么原因造成的?可能是您在DOM准备就绪之前触发了此JS代码。这是我的实现
<!--Basically I am firing this script with onload event function.-->
<html>
<head></head>
<body onload="init()">
<script>
function init() {
alert("asg");
var t1 = new Date().getTime();
while(true) {
//general code in here...
document.body.appendChild(document.createElement('div')); //This causes the problem
if(isInfinite(t1, 3000)) {
alert('Loop stopped after 3 seconds')
break;
}
}
function isInfinite(t1, timeLimit) {
var t2 = new Date().getTime();
if(t2 - t1 > timeLimit) {
return truite;
} else return false;
}
}
</script>
</body>
</html>
函数init(){
警报(“asg”);
var t1=new Date().getTime();
while(true){
//这里的通用代码。。。
document.body.appendChild(document.createElement('div'));//这会导致问题
if(isInfinite(t1,3000)){
警报('循环在3秒后停止')
打破
}
}
函数isInfinite(t1,时间限制){
var t2=新日期().getTime();
如果(t2-t1>时间限制){
返矿;
}否则返回false;
}
}
然而,这个脚本很可能会崩溃,这取决于浏览器制造商对循环设置的限制(这通常发生在主线程被阻塞时)。所以我认为在这个例子中使用setTimeout函数更好
只是为了你的利益
Javascript是基于事件的,它只有一个线程。你提到你将向初学者展示它。为什么不向他们解释JS基于事件的本质而不是这样做呢?你需要让处理器喘口气。使用setTimeout,而不是在紧密循环中创建元素和Dom操作是的,我通常不会这样做,这一部分将是我为初学者创建的工具的一部分,他们可能会这样做。所以我仍然需要它来捕获。@mplungjan任何无限while循环都会杀死处理器,这正是我试图解决的问题,所以你的建议放错了地方。当最终结果是:不要这样做时,它怎么会放错地方呢。你可以通过几种方式使浏览器崩溃,所以学习不崩溃可能是需要的教训?到这里,在while(true){}中复制,你就会明白我在说什么。当然,用户不应该这样做,但偶尔会发生错误。为什么不给他们一个有用的提醒,而不是让整个浏览器崩溃呢?这仍然不能抓住它。我最好奇的是,为什么它在调试时捕获,而在运行时却没有捕获。我只想让它捕捉到,不管循环中放了什么。