2011-02-23 37 views
0

我有一個long for循環來驗證表格中每行一行(超過1000行)的文本框:我不斷收到「stop running this script」錯誤。許多網站提到了setTimeout()函數。但我仍然無法讓它工作。這裏是我的代碼:使用settimeout來防止jquery中的「停止運行這個腳本」

var numRows = $("#tablex").attr('rows').length; 
var errorMsg=""; 
for (var tbRow = 1; tbRow < numRows - 1; tbRow++) { 
     var aRecord = $("#tablex tr:eq(" + tbRow + ") td:eq(1)").attr("innerText"); 
     var curECD = $("#tablex tr:eq(" + tbRow + ") td:eq(7)").find(':text').val().trim(); 

     if (curECD != "" && isDate(curECD) == false) 
      errorMsg += "Date for " + aRecord + " is invalid<br/>"; 
} 

任何人都可以幫忙嗎?謝謝!!!

+4

我知道這不是一個答案,但我得'問:爲什麼你有一個形式超過1000文本輸入? – 2011-02-23 05:30:31

回答

0

我做了這個this little example來幫助你用setTimeout來枚舉塊的列表。

function enumerate(list, groupSize, callback, complete, debug){ 
    var iterations = 0; 
    for (var i = 0; i < list.length; i+=groupSize, iterations++){ 
     (function (group, index, isLast){ // new context 
      setTimeout(function(){ 
       for (var j=0; j < group.length;j++){ 
        debug && console.log(group[j]); 
        callback.call(group[j], (index+j+1)); 
       } 
       isLast && complete.call(); 
      }, 1); 
     })(list.slice(i, i+groupSize), i, (list.length < i+groupSize)); 
    } 
    debug && console.log('iterations: ' + iterations); 
} 

這樣稱呼它:

var trs = $('#tablex tr'), 
    errorMsg = '', 
    onItem = function(){ 
     var aRecord = $("td:eq(1)", this).attr("innerText"); 
     var curECD = $("td:eq(7)", this).find(':text').val().trim(); 

     if (curECD != "" && isDate(curECD) == false) 
      errorMsg += "Date for " + aRecord + " is invalid<br/>"; 
    }, 
    complete = function(){ 
     console.log(errorMsg); 
    }; 

enumerate(trs, 5, onItem, complete); 
+0

謝謝,但我仍然不明白。 – user629565 2011-02-23 10:04:07

+0

@ user629565 - 這裏是我將如何實現它。 – 2011-02-23 17:36:56

0

我認爲第一上述方案建議是更好的,但你也可以做到這一點遞歸這樣的,我認爲。取決於你的要求:

var errorMsg="";  

function validateRow(row, callback){ 
    if(row.size() == 0){ 
     callback(); 
    } 

    var aRecord = $("td:eq(1)", row).attr("innerText"); 
    var curECD = $("td:eq(7)", row).find(':text').val().trim(); 

    if (curECD != "" && isDate(curECD) == false) 
     errorMsg += "Date for " + aRecord + " is invalid<br/>"; 

    setTimeout(function(){ 
     validateRow(row.next(), callback); 
    }, 25); 
} 

validateRow($("#tablex tr:first"), function(){ 
    alert("finished validating"); 
}); 

這將調用validateRow並傳入第一行。 ValidateRow將比setTimeout自動調用並傳入下一行。當它到達結尾時,它會調用你提供的回調函數。

+0

它只通過第一行循環,爲什麼?回答你的問題:因爲需求改變了,首先是25-50個記錄。 – user629565 2011-02-23 10:02:03