2012-05-30 79 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