-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回しか実行されないため、この場合、配列には2つのxqアイテムが含まれていることです。また、setInterval内で2回実行される場合、私の質問はこれを修正する方法です。 、つまり、インデックスインデックスを作成せずに、配列要素を変更するようなものです。事前に感謝します。USAJQUERYのような答えを期待しないでください。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..in列挙子ステートメントを使用してコレクションを反復処理します。これは予期しない結果をもたらす可能性があります。代わりに、通常のforループ、またはArray.forEach()(配列の場合)を使用してください。

最後に、インターバルを終了することはありません。関数ロジックをステートメントでラップするのではなく、そのステートメントifにを入れる必要があります。clearIntervalif

于 2013-02-05T02:06:00.237 に答える