【问题标题】:use settimeout to prevent "Stop running this script" in jquery在 jquery 中使用 settimeout 防止“停止运行此脚本”
【发布时间】:2011-02-23 05:16:54
【问题描述】:

我有一个很长的 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/>";
 }

谁能帮忙?谢谢!!!

【问题讨论】:

  • 我知道这不是一个答案,但我得问:为什么你在一个表单中有超过 1000 个文本输入?

标签: jquery settimeout


【解决方案1】:

我认为上述第一个建议的解决方案更好,但我认为您也可以像这样递归地执行它。取决于您的要求:

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 上调用自身并传入下一行。当它到达末尾时,它将调用您提供的回调函数。

【讨论】:

  • 它只循环第一行,为什么?回答你的问题:因为需求变了,所以先申请25-50条记录。
【解决方案2】:

我创建了这个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);

【讨论】:

  • @user629565 - 这是我将如何实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多