2011-02-23 8 views
0

테이블 (1000 행 이상)에서 한 번에 한 행씩 텍스트 상자의 유효성을 검사하는 데 긴 for 루프가 있습니다. "이 스크립트 실행 중지"오류가 계속 발생합니다. 많은 웹 사이트에서 setTimeout() 함수에 대해 언급했습니다. 그러나 나는 아직도 그것을 작동시키지 않는다. 여기 내 코드 :jquery에서 "이 스크립트 실행 중지"를 방지하기 위해 settimeout 사용

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 가지가 넘는 텍스트 입력을 한 가지 형태로 가지고있는 이유는 무엇입니까? –

답변

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

+0

@ user629565 - 여기에 구현 방법이 나와 있습니다. –

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

첫 번째 행을 순환합니다. 이유가 무엇입니까? 귀하의 질문에 대한 답변 : requirment가 변경되었으므로, 먼저 25-50 레코드가 필요합니다. – user629565

관련 문제