2012-03-23 258 views
1

林調用一個for循環內的循環,它不工作,下面的代碼:嵌套循環不工作

function PopulateMonths() { 
for (var m = 0; m < 12; m++) { 
    var $month = $('.d-month').clone(); 
    $month.find('.d-header').text(m); 
    $month = PopulateDays($month); 
    $month.appendTo('#diary').show(); 
    $month = null; 
} 
} 

function PopulateDays($month) { 
for (var d = 0; d < 30; d++) { 
    var $row = $('.d-row').clone(); 
    $row.find('.d-day').text(d); 
    $row.appendTo($month).show(); 
    $row = null; 
} 
return $month; 
} 

如果我打電話PopulateDays手動12倍早點工作正常,如我嘗試使用PopulateMonths()循環12次頁面崩潰,CPU使用率通過屋頂,所以我承擔了大量的工作。

我錯過了什麼?

回答

3

我以前不得不解決一個非常類似的問題。這是因爲當你克隆元素時,你也在克隆他們的類等。然後你將克隆的項插入到文檔中。

下次嘗試查找具有該類的元素時,它會找到兩個實例 - 原始實例和上一步中克隆的實例。兩者都將被克隆,現在你在頁面上有4個元素。因此,基本上每次迭代中的元素數量加倍,並且在幾天內執行12次,而在幾個月內執行的次數爲30次。

 
2^12 = 4096 
2^30 = 1,073,741,824 

這些只是粗略估計它可以增長多大。我沒有做任何進一步的分析來找到確切的數字,但基本上指數增長正在吃掉CPU並導致瀏覽器崩潰。

+0

我明白你的意思了,所以我需要對我的選擇更加具體,讓我的頭腦變得圓滿。謝謝 – LenPopLilly 2012-03-23 00:52:25

+0

是的,要麼是更具體的,要麼從您選擇的克隆元素中刪除該類。 – Anurag 2012-03-23 00:58:41

+0

現貨,再次感謝。 – LenPopLilly 2012-03-23 01:00:18

0

我相信,因爲你是克隆組一個月的元素在這條線:

var $month = $('.d-month').clone(); 

,然後在填入天的功能在此行追加30行到一個月:

$row.appendTo($month).show(); 

然後在該行中追加月份到日記中:

$month.appendTo('#diary').show(); 

然後下一次這個lin Ë執行還有一個月,它們會在這一行克隆:

var $month = $('.d-month').clone(); 

除了在這一行再克隆剛剛追加了行:

var $row = $('.d-row').clone(); 

在一個循環中執行這增加了負荷基本上。