Javascript 一页多个倒计时(js/jQuery)

Javascript 一页多个倒计时(js/jQuery),javascript,jquery,Javascript,Jquery,我试图在一个页面上放置几个(从5到25)简单的倒计时,浏览器崩溃(100%CPU负载) 请救人 function timersInit(){ $('[data-countdown]').each(function() { var timerObject = $(this), time_left_nix = parseInt(timerObject.data('countdown')), time_left_h = Math.

我试图在一个页面上放置几个(从5到25)简单的倒计时,浏览器崩溃(100%CPU负载)

请救人

function timersInit(){
    $('[data-countdown]').each(function() {
        var timerObject = $(this),
            time_left_nix = parseInt(timerObject.data('countdown')),
            time_left_h = Math.floor(time_left_nix / 3600),
            time_left_m = Math.floor((time_left_nix / 60) - (time_left_h * 60)),
            time_left_s = Math.floor(time_left_nix - (time_left_m * 60) - (time_left_h * 3600));

        timerObject.text(time_left_h + ":" + (time_left_m < 10 ? "0" + time_left_m : time_left_m) + ":" + time_left_s);
    });

    setTimeout(timersInit(), 1000);
}
函数timersInit(){
$(“[data countdown]”)。每个(函数(){
var timerObject=$(此),
time_left_nix=parseInt(timerObject.data(‘倒计时’),
时间左=数学楼层(时间左/3600),
time\u left\u m=数学地板((time\u left\u nix/60)-(time\u left\u h*60)),
time_left_s=Math.floor(time_left_nix-(time_left_m*60)-(time_left_h*3600));
timerObject.text(time_left_h+“:”+(time_left_m<10?“0”+time_left_m:time_left_m)+“:”+time left_s);
});
setTimeout(timersInit(),1000);
}

代码的问题是函数
timersInit()
被无限次地立即调用

请注意,函数在
setTimeout
内立即调用,返回值用作超时后调用的函数。这会导致函数无限递归调用,直到浏览器挂起

function timersInit() {

    ....

    setTimeout(timersInit(), 1000);
    // timersInit(): means call immediately
}
要解决此问题,可以使用函数引用而不是调用它

setTimeout(timersInit, 1000); // Removed `()` of `timersInit`

为了提高性能,我建议缓存元素并仅在可见元素上循环

var countdownEl = $('[data-countdown]:visible'); // Cache

function timersInit() {
    countdownEl.text(function () { // Use cached version instead of diving into DOM
        var time_left_nix = parseInt($(this).data('countdown')),
            time_left_h = Math.floor(time_left_nix / 3600),
            time_left_m = Math.floor((time_left_nix / 60) - (time_left_h * 60)),
            time_left_s = Math.floor(time_left_nix - (time_left_m * 60) - (time_left_h * 3600));

        return time_left_h + ":" + (time_left_m < 10 ? "0" + time_left_m : time_left_m) + ":" + time_left_s;
    });

    setTimeout(timersInit, 1000);
}
var countdownEl=$(“[数据倒计时]:可见”);//隐藏物
函数timersInit(){
text(函数(){//使用缓存版本,而不是深入DOM
var time_left_nix=parseInt($(this).data('countdown'),
时间左=数学楼层(时间左/3600),
time\u left\u m=数学地板((time\u left\u nix/60)-(time\u left\u h*60)),
time_left_s=Math.floor(time_left_nix-(time_left_m*60)-(time_left_h*3600));
返回时间左上角+“:”+(左下角时间<10?“0”+左下角时间:左下角时间+“:”+左下角时间;
});
设置超时(timersInit,1000);
}

设置超时(timersInit(),1000)==>
设置超时(timersInit,1000)
$('[data countdown]')
===>
$('[data countdown]:可见')
将其放在答案上。。。。我会核对正确答案…我的代码中有如此愚蠢的错误。。。。早上6点。。。需要(睡眠)谢谢你的帮助!我的代码中有这么愚蠢的错误。。。。早上6点。。。需要(睡眠)