【问题标题】:Loop function for specified time, followed by delay指定时间的循环功能,然后是延迟
【发布时间】:2015-10-09 07:05:15
【问题描述】:

我有一小段代码每 500 毫秒连续单击一个名为“查看旧消息”的按钮,以便从网页加载无限滚动的内容。这样做的原因是个人的,但不用说,我正在尝试自动化一些事情,否则我需要数周的不间断滚动才能做到这一点。

问题在于,随着脚本运行时间的推移,500 毫秒的延迟逐渐开始下降。这么多小时后,可能需要 5 秒或更长时间。我假设这个问题是由 Facebook 在这么长时间后限制我的请求引起的,所以为了防止这种情况,我想让脚本运行一段时间 - 比如 2 分钟 - 然后在它运行之前延迟大约 20 秒再持续 2 分钟,以此类推。我该怎么做呢?我绞尽脑汁,但我对 JavaScript 的有限知识并没有想出任何有意义的东西。

下面是完整的当前代码。

setInterval(function () {
document.getElementById('see_older').getElementsByClassName('content')[0].click();
}, 500);

非常感谢。

【问题讨论】:

  • 这可能只是您的浏览器因闲置而失去操作系统注意力的问题。在这种情况下,将无法通过 JavaScript 加快速度。
  • 如果向下滚动时页面上的所有先前内容仍在页面上,也可能是内存问题
  • 一种可能的选择是使用带有 youtube 视频的 iframe,并在播放该视频并在后台运行脚本时让浏览器选项卡保持焦点。这可能会迫使操作系统保留该浏览器选项卡的资源。
  • @arcyqwerty 就是这样,最后我运行了它运行在 170 万 K 内存的脚本。这种解决方案不会解决甚至缓解问题吗?
  • 170 万 K 等于 1.7 GB。您的浏览器可能无法快速处理那么多数据。由于它还没有崩溃,我假设你没有使用 IE。最好将您想要的内容提取到文件中并将其保存到磁盘,但这是一个不同的问题。

标签: javascript loops delay


【解决方案1】:
  1. 跟踪脚本运行的开始时间
  2. 在不到 2 分钟的时间内,请继续每 500 毫秒点击一次。
  3. 运行约 2 分钟后,停止并在 20 秒后排队等待下一次运行。
  4. 转到第 2 步。

-

var lastChange;

function doClick() {
  if (new Date() - lastChange < 120000 /* 2 mins */) {
    document.getElementById('see_older').getElementsByClassName('content')[0].click();
    setTimeout(doClick, 500);
  } else setTimeout(runScript, 20000 /* 20s */);
}

(function runScript() {
  lastChange = new Date();
  doClick();
})();

-

我建议使用setTimeout 而不是setInterval,因为如果浏览器需要一段时间才能执行、失去焦点并停止执行 JS、被分页等等,那么您仍然会获得您所设置的事件之间的时间间隔想。见https://stackoverflow.com/a/731625/1059070

【讨论】:

    【解决方案2】:

    通过设置另一个计时器来切换您的函数是否执行任何操作。

    /* When true do load else don't. */
    window.doLoad = true
    
    setInterval(function () {
        if window.doLoad {
            document.getElementById('see_older').getElementsByClassName('content')[0].click();
        }
    }, 500);
    
    /* This will toggle doLoad every two minutes. */
    setInterval(function () {
        if (window.onLoad == true) { 
            window.doLoad = false;
        } else { window.doLoad = true; }
    }, 120000); // two minutes of milliseconds
    

    在您的情况下,您最好使用 Facebook Graph API

    【讨论】:

    • 什么是doLoad?我在任何地方都找不到对它的引用。
    • doLoad 是这个代码添加到窗口对象的一个​​新变量。它没有记录,我只是编造的。
    • 这可能是一个新手问题,但它在哪里被定义 - 在第一行?不是所有变量都必须用var定义吗?
    • 如果您将其附加到这样的对象,则不必使用 var 定义。这就是 JavaScript 的力量(也是它危险的部分原因)。 Var 用于当您引用全局变量或尝试创建新的局部变量时并不明显。
    • 好的,祝你好运。有时你只需要完成它,不能永远努力让它完美。
    猜你喜欢
    • 2013-01-24
    • 2017-06-16
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2011-10-29
    • 2023-03-13
    相关资源
    最近更新 更多