0

私の質問は簡単です。for ループ内で setTimeout を使用しています。実行時に次のようなエラーが生成されます。

Uncaught TypeError: Cannot call method 'setAttribute' of undefined

私のjavascriptの経験はわずかで(学習のためにjQueryをスキップしています)、setTimeoutを呼び出す方法に何かがあると思います。

私の関数を見てください。無名関数内から「要素」を使用できない理由を知りたいです。

function hide_visable_elements()
{
    // remove body EventListener
    var body = document.getElementsByTagName("body");
    body[0].removeEventListener("click", hide_visable_elements, true);

    var elements = document.getElementsByClassName("visible");
    for (var i = 0; i < elements.length; ++i)
    {
    elements[i].removeAttribute("class");
    setTimeout(function() { elements[i].setAttribute("class", "hidden") }, 300);
    }   
}
4

1 に答える 1

1

以下は、反復の現在の値を取得して、ループが完了した後に実行する方法の例です (非同期の性質のため、常に後に実行されます)。

function setHidden(element) {
    return function() {
        element.setAttribute("class", "hidden");
    };
}

function hide_visable_elements() {
    // remove body EventListener
    var body = document.getElementsByTagName("body");
    body[0].removeEventListener("click", hide_visable_elements, true);
    var elements = document.getElementsByClassName("visible");
    for (var i = 0; i < elements.length; ++i) {
        elements[i].removeAttribute("class");
        setTimeout(setHidden(elements[i]), 300);
    }
}


ところで、「ずっと後」という説明を比較的使用しています。遅延関数が実行される可能性があるまでに経過する最小時間は4または13ミリ秒ですが、ループの実行時間はマイクロ秒またはナノ秒で測定されます。

于 2013-07-21T15:55:48.910 に答える