-3

我有一些函数返回 getById getByClass 和一个具有 id 或类的 html 元素数组。问题是我想将这样的动画应用于每个元素和这些数组,每个人都平等地在一个函数中,我现在有这个。

var slideDown = function (elem, to) {
    var e = getById(elem),
        st, i;
    if (e == false) {
        e = getByClass(elem);
    }
    for (var i in e) {
        //alert(e[i].offsetHeight + e[i].nodeName + e[i].textContent.trim());
        st = setInterval(doAnim(e[i]), 1000);

        function doAnim(e, h) {
            h = e.offsetHeight;
            if (h < to) {
                e.style.height = h + "px";
                h++;
                console.log(h);
                doAnim(e[i], h);
            }
        }
    }
}

问题是因为 for 循环中的动画函数只会运行两次,在这种情况下,数组包含 2 个 xq 项目,如果我放出也运行两次 xq for setInterval is inside,我的问题是如何解决这个问题,我的意思是,就像修改数组元素一样,不必去索引索引。在此先感谢,不要指望像 USA JQUERY 之类的答案,我知道 jquery 会这样做,但我正在尝试调查新事物,但在这方面锁定了我。

4

1 回答 1

0

首先,setInterval将函数作为第一个参数。但是,不是传递对函数的引用,而是调用一个返回的函数undefined(即,它没有返回值)。因此,setInterval接收undefined作为第一个参数。

相反,您需要传递一个函数引用:

st = setInterval(doAnim(e[i]), 1000);

function doAnim(e, h) {
    return function() {
        h = e.offsetHeight;
        if (h < to) {
            e.style.height = h + "px";
            h++;
            console.log(h);
            doAnim(e[i], h);
        }
    };
}

接下来,您将使用for..inenumerator 语句迭代集合。这可能会产生意想不到的后果。相反,使用常规for循环,或者Array.forEach()(如果它是一个数组)。

最后,你永远不会终止你的间隔。if与其将函数逻辑包装在语句中,不如将 aclearInterval放入该if语句中。

于 2013-02-05T02:06:00.237 回答