2012-05-30 84 views
1

我想知道我怎么能用JS解决悬挂页面。JS挂在做while while循环

我有一个JS循环这样的IM测试,但它似乎挂起永远这 - 是有没有办法阻止它挂,而实际上仍然完成剧本:

<div id="my_data"></div> 

<script> 
function test(value){ 
output= []; 
do{ 
    value++; 
    output.push(value); 
    document.getElementById('my_data').innerHTML = (output.join('')); 
}while(value < 10000000); 
alert('end'); // never occurs 
} 

test(0); 
</script> 
+0

你想用10000000次做什么? – diEcho

+0

什么我只是做一个测试 - 我没有把它应用到网站或任何东西。 – Sir

+0

不要测试浏览器的耐心 – diEcho

回答

3

您连续级联数10,000,000连成一串,这真的不会在任何现代超级计算机很好地工作。

如果您想查询进度,设置一个计时器来做到这一点有点慢。这是不实际的,但它看起来不错:http://jsfiddle.net/V6jjT/2/

HTML:

<div id="my_data"></div> 

脚本:

var value = 0; 
var interval = setInterval(function() { 
    if (value > 100) { 
     clearInterval(interval); 
     return; 
    } 

    value++; 
    document.getElementById('my_data').innerHTML += ' ' + value; 
}, 10); 
+0

啊,多喜欢它! – Sir

+0

您是否可以更新您的问题,提及您希望看到更新,因为他们碰巧让问题和答案对他人更有帮助? –

7

你更新? DOM越来越长的字符串千万次。

如果你是某种超正从未来的,那么也许这是有道理的。

+0

我喜欢这个KO答案,+1 – zerkms

+0

我该怎么做更新div,因为它循环,所以我可以看到号码上升? – Sir

+1

@Dave你想要做什么? – Pointy

2

运行,直到它完成这样一个紧密的循环将不会更新任何东西;此外,还有10M数组项目?!

如果你真的想这样做,而不是让浏览器挂起,直到永远,你必须使用setInterval来让浏览器之间的刷新英寸

function updater(value, max, interval) { 
    var output = [], 
    node = document.getElementById('my_data'), 
    tid = setInterval(function() { 
    if (value++ < max) { 
     output.push(value); 
     node.innerHTML = (output.join('')); 
    } else { 
     alert('done'); 
     clearInterval(tid); 
    } 
    }, interval); 
} 

updater(0, 10, 200); 
5

JavaScript是单线程的,所以没有什么人可以当它运行你的循环发生。它运行一千万次,并且在每次运行中它都将#my_data的innerHTML设置为新的。这是非常低效的,似乎没用。你想达到什么目的?

+0

我想看到数字增加,因为它循环 – Sir

+0

这不会发生。浏览器只会在循环完成后重新呈现。 –

+0

尽管如此,还是有办法做到的。 – Sir

1

你不应该更新HTML每次迭代。

function test(value){ 
    output= []; 
    do { 
     value++; 
     output.push(value); 
    } while(value < 10000000); 
    document.getElementById('my_data').innerHTML = (output.join('')); 
    alert('end'); // never occurs 
} 

应该工作(尽管HTML中的1000万数字仍然需要他们的时间来呈现)。

如果你想看到的数字运行,你应该window.setInterval看看 - 浏览器需要执行JS之间的某个时间以刷新其视图。因此,您将不得不重新编写运行几块数据的代码。另请参见:

+0

但这只会导致显示最后一个数字,我想看到数量增加,因为它循环。 – Sir

+0

你真的不能。浏览器将更新其UI以在该循环完成时显示数字。在它挂起JS执行的原因之前。 – Bergi