使用2d数组的Javascript

使用2d数组的Javascript,javascript,Javascript,我试图使用这段代码从html元素创建倒计时。。但是我不想在同一个元素上运行两个计时器,所以我尝试创建一个2D数组来存储setInterval函数及其对应的元素,这样当在同一个元素上设置另一个计时器时,我就可以清除Interval。下面是我尝试过但不起作用的代码,它总是返回-1 function formatTime(seconds) { var h = Math.floor(seconds / 3600), m = Math.floor(seconds / 60) % 6

我试图使用这段代码从html元素创建倒计时。。但是我不想在同一个元素上运行两个计时器,所以我尝试创建一个2D数组来存储setInterval函数及其对应的元素,这样当在同一个元素上设置另一个计时器时,我就可以清除Interval。下面是我尝试过但不起作用的代码,它总是返回-1

function formatTime(seconds) {
    var h = Math.floor(seconds / 3600),
        m = Math.floor(seconds / 60) % 60,
        s = seconds % 60;
    if (h < 10) h = "0" + h;
    if (m < 10) m = "0" + m;
    if (s < 10) s = "0" + s;
    return h + ":" + m + ":" + s;
}

var timers = new Array();
function timer(count, element) {
    var n = timers.indexOf(element);
    if (n > -1) {
        clearInterval(timers[n][1]);
    }

    timers.push([
        element, setInterval(function() {
            if (isNaN(count))
                return false;

            count--;
            if (count < 0) return clearInterval(interval);
            element.text(formatTime(count));
            return true;
        }, 1000)
    ]);
}

问题在于计时器数组不包含元素,而是包含元素和setInterval函数的数组。因此,timers.indexOfelement将始终返回-1。除非您使用的是jQuery或类似的东西,否则您的元素需要具有id或具有唯一值的其他属性。假设它们都有一个唯一的id,则必须用以下内容替换计时器功能:

var timers = {};
function timer(count, element) {
    if(timer[element.id] != undefined) {
        clearInterval(timers[element.id]);
    }

    timers[element.id] = setInterval(function() {
        if (isNaN(count))
            return false;

        count--;
        if (count < 0) return clearInterval(interval);
        element.text(formatTime(count));
        return true;
    }, 1000);
}
假设您的元素是一个DOM元素,它具有类似getElementById的特性。

而不是使用indexOf,您可以使用循环搜索条目

function timer(count, element) {
    var match;
    for(var i = 0, l = timers.length; i < l;) {
        var entry = timers[i];
        if(entry.element === element) {
            timers.splice(i, 1);
        } else {
            i++;
        }
    }
    var entry = {
        element: element,
        timer: setInterval(function() {
            count--;
            if (isNaN(count) || count < 0) {
                var index = timers.indexOf(entry);
                if(index > -1) timers.splice(index, 1);
                return clearInterval(entry.timer);
            }
            element.text(formatTime(count));
            return true;
        }, 1000)
    };
    timers.push(entry);
}

你的计时器。指数感觉;正在尝试在timers中查找元素,该元素是数组数组而不是元素数组。可能值得改用对象:timers={};或者更好的是,将计时器的id存储在元素本身的数据属性中。这样,当计时器结束时,不需要从数组中删除元素引用。在元素上保留一个计时器的简单方法是使用元素。_timer=setInterval。。。和clearIntervalelement.\u定时器;不需要传递ID或引用使其过时。