【问题标题】:Javascript recursion and setTimeout: What's wrong? [duplicate]Javascript 递归和 setTimeout:怎么了? [复制]
【发布时间】:2019-07-10 17:03:33
【问题描述】:

我正在尝试编写代码来向下滚动网站上的 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 有什么误解吗?

【问题讨论】:

  • 你正在立即调用scrollDiv...传递一个调用它的函数
  • 知道了!谢谢你。现在可以使用了。

标签: javascript html recursion dom settimeout


【解决方案1】:

正在立即评估 scrollDiv 函数。

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

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

【讨论】:

  • 是的,你是对的!我将其更改为: setTimeout(scrollDiv, 100, div, scrollElem, scrolls - 1);
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2019-06-10
  • 2011-12-31
  • 1970-01-01
  • 2018-03-11
  • 2014-06-04
  • 2016-07-28
相关资源
最近更新 更多