2014-06-16 78 views
1

當前函數需要很長時間循環並影響應用程序的性能。有人可以幫助我將each()函數轉換爲for循環嗎?謝謝將.each()轉換爲for循環jQuery

$('.scrollable tr:last').find('input[name="resource_week_value[]"]').each(function() { 
     var pos = $(this).closest('td').prevAll().length; 
     var tot = 0; 
     var that = this; 
     var temp = $(this).closest('tr').prevAll().find('td:eq(' + pos + ')').find('input[name="resource_week_value[]"]').each(function() { 
      tot += +$(this).val(); 
      $(that).val(tot); 
     }); 
    }); 
+4

也許你應該看看爲什麼代碼利用內太長。不要認爲改變爲for循環將會改變性能。 – putvande

+0

您可以嘗試向要選擇的輸入添加一個類,這比通過名稱選擇它們要快得多。 – amenadiel

+0

如果您爲每個輸入添加唯一的ID,並使用'['id^= resuource_week']'獲取它,因爲ID選擇器比類更快! –

回答

1

評論,你做了兩件事是錯誤的:

1)您經常使用find()查詢DOM樹。而是使用正確的CSS選擇

2)裏面的$。每()循環

var temp = $(this).closest('tr').prevAll().find('td:eq(' + pos + ')').find('input[name="resource_week_value[]"]').each(function() { 
       tot += +$(this).val(); 
       $(that).val(tot); 
      }); 

您經常更新的input的價值,這是不需要的。在每個循環內部,每次使用$(that).val(tot);時,DOM樹都會受到影響。

由於tot被分配給一個變量,所以他在each()循環之外,把$(this).val(tot)這會給你一個有效的方式相同的結果。

3)這不是一個性能的提高,而不是一個代碼錯誤:

您正在使用tot += +$(this).val();

,但它應該是tot += $(this).val();循環

0

會不會這麼做?

$('input[name="resource_week_value[]"]').each(function() { 
     var pos = $(this).closest('td').prevAll().length; 
     var tot = 0; 
     var that = this; 
     var temp = $(this).closest('tr').prevAll().find('td:eq(' + pos + ')').find('input[name="resource_week_value[]"]').each(function() { 
      tot += +$(this).val(); 
    }); 
}); 
0

沒有您的標記也很難告訴你的代碼做什麼,但下面的猜測可能會幫助你找出一個更好的辦法來重新編寫代碼:正如我所提到的

$('.scrollable tr').last().find('tr').each(function(i, v) { 
    var that = $(this), 
     tot = that.find('td').map(function(k,l){ return 0; }).get(); 
    that.prevAll().each(j,u) { 
     tot = $(this).find('td').map(function(k,l) { 
      return +$(l).find('input[name="resource_week_value[]"]').val() + tot[k]; 
     }).get(); 
    }); 
    that.find('td').each(function(j,u) { 
     $(u).find('input[name="resource_week_value[]"]').val(tot[ j ]); 
    }); 
});