JQUERY/JavaScript -故障代码导致谷歌浏览器冻结

JQUERY/JavaScript - trouble code causing google chrome to freeze

本文关键字:谷歌浏览器 冻结 代码 故障 JavaScript JQUERY      更新时间:2023-09-26

我有一些代码循环并调用一个对表进行一些计算的函数。我已经痛苦地通过了大量的代码,以查明这一特定的代码是铬冻结约一分钟的原因。有没有人有任何建议,如何从性能的角度改进这段代码?

function getAverage(a, b) {
    var sum = 0;
    var count = 0;
    $(a).each(function () {
        $content = $(this).html();       
        var tdTxt = parseFloat($(this).text(), 10) || 0;
        if ($(this).hasClass(b)) {
            var theAvg = parseFloat((sum / count), 10) || 0;
            $(this).text(theAvg.toFixed(2));
            sum = 0;
            count = 0;
        } else {
            sum += parseFloat(tdTxt);
            if ($content == '') {
            }
            else {
                count += 1;
            }
        }
    })
}
        var el1 = $('#rackPlan1 > thead > tr > th:gt(17):not(.totalRow)');    
        var starter = 19; 
        for (i = 0; i < el1.length; i++) {
            $('#rackPlan1 > tbody > tr > td:nth-child(' + starter + ')').each(function () {
                getAverage('#rackPlan1 > tbody > tr > td:nth-child(' + starter + ')', 'subTotal');
            })
            starter += 1;
        }

多谢

严格看getAverage()函数,我建议:

<标题> 1
function getAverage(a, b) {
    var $this, $content, tdTxt, theAvg; // it's marginally less expensive to declare vars at a higher scope and re-use them in a lower scope
    
    var sum = 0;
    var count = 0;
    
    $this = $(a); // cache this nth-child received from the $.each loop
    $content = $this.html();
    tdTxt = parseFloat($this.text(), 10) || 0;
    if ($this.hasClass(b)) {
        theAvg = parseFloat((sum / count), 10) || 0;
        $this.text(theAvg.toFixed(2));
        sum = 0;
        count = 0;
    } else {
        sum += parseFloat(tdTxt);
        if ($content == '') {
        }
        else {
            ++count; // this micro-optimization makes it marginally faster
        }
    }
}

<标题> 2 h1> 看另一段代码:
var el1 = $('#rackPlan1 > thead > tr > th:gt(17):not(.totalRow)');
var starter = 19;
$('#rackPlan1 > tbody > tr > td:nth-child(' + starter + ')').nextUntil(':nth-child(' + ((starter+el1.length)-1) + ')').each(function(){
    getAverage(this, 'subTotal');
});

<标题> 3

我对:nth-child没有充分的经验,所以也许这个更好?

$('#rackPlan1 > tbody > tr > td:nth-child(' + starter + 'n+' + ((starter+el1.length)-1) + ')').each(function(){
    getAverage(this, 'subTotal');
});

<标题> 4

如果nth-child的东西失败,然后简单地尝试替换:

getAverage('#rackPlan1 > tbody > tr > td:nth-child(' + starter + ')', 'subTotal');

getAverage(this, 'subTotal');