использовать settimeout, чтобы запретить запуск этого скрипта в jquery - PullRequest
0 голосов
/ 23 февраля 2011

У меня длинный цикл for для проверки текстовых полей по одной строке в таблице (более 1000 строк): я продолжаю получать сообщение об ошибке «прекратить выполнение этого сценария».Многие сайты упоминали функцию 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/>";
 }

Может кто-нибудь помочь?спасибо !!!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2011

Я думаю, что первое предложенное выше решение лучше, но вы также можете сделать это рекурсивно, как это, я думаю. Зависит от ваших требований:

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 голосов
/ 23 февраля 2011

Я сделал этот этот небольшой пример , чтобы помочь вам перечислить список в виде фрагментов с 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);
...