Javascript递归和setTimeout:怎么了? [重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我正在尝试编写代码来向下滚动网站上的div。 div有一个当你滚动到底部时会自动加载的内容。我通过添加一个带有自身链接的元素,点击它,删除它,然后重新添加(到新的底部)来实现这一点。我的代码看起来像这样:

function showWholeDiv() {
    clearTimeout();
    console.log("Running:");
    let contents;
    let myDiv = document.getElementsByClassName("{classname}")[0];
    contents = myDiv.children;
    let elem = document.createElement("a");
    elem.id = "scroll-here";
    elem.href = "#scroll-here";
    myDiv.appendChild(elem);
    scrollDiv(myDiv, elem, 10);
};

function scrollDiv(div, scrollElem, scrolls) {
    clearTimeout();
    if (scrolls > 0) {
        console.log("scrolling...");
        div.appendChild(scrollElem);
        document.getElementById("scroll-here").click();
        scrollElem.remove();
        setTimeout(scrollDiv(div, scrollElem, scrolls - 1), 100);
    } else {
        console.log(div);
    }
};

它适用于一个滚动,但后来我得到这个奇怪的消息,它一次又一次地输出“滚动...”而没有延迟:

scrolling...
680a7736f556.js:44 [Violation] 'setTimeout' handler took 179ms
contentScript.js:34 scrolling...
680a7736f556.js:44 [Violation] 'setTimeout' handler took 143ms
contentScript.js:34 scrolling...
680a7736f556.js:44 [Violation] 'setTimeout' handler took 162ms
contentScript.js:34 scrolling...
680a7736f556.js:44 [Violation] 'setTimeout' handler took 154ms
contentScript.js:40 <div class=​"PZuss">​…​</div>​

我添加了clearTimeouts以查看是否存在问题,但它没有帮助。这里发生了什么?有没有关于setTimeout的事我误解了?

javascript html recursion dom settimeout
1个回答
0
投票

正在立即评估scrollDiv函数。

解决这个问题的一种方法是将其包装在一个闭包中

setTimeout(function(){scrollDiv(div,scrollElem,scrolls - 1}),100);

© www.soinside.com 2019 - 2024. All rights reserved.