如何在到达网页底部时检查(并终止)javascript滚动

时间:2017-11-15 21:44:33

标签: javascript scroll

我已经在Python工作了几年,最近开始研究Javascript(不是jQuery或依赖,只是普通的Javascript),用于某些浏览器自动化任务。

使用fx Selenium,使用延迟加载(如Facebook页面,Twitter页面或甚至是Wallmart网站)滚动网站很简单。

在Python中,粗略的'n'脏解决方案可能是高度检查,如果高度停止增加,则可以突破while循环。像这样:

check_height = driver.execute_script("return document.body.scrollHeight;") 
while True:
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    height = driver.execute_script("return document.body.scrollHeight;") 
    if height == check_height: 
        break 
    check_height = height

所以现在我正在尝试使用Chrome控制台在Javascript中完成同样的事情。到目前为止,一个工作代码看起来像这样:

var scrollToBottom = function() {
    window.scrollTo(0, document.body.scrollHeight);
    }
var sleep = 1000;
var kill_ID = setInterval(scrollToBottom, sleep);

setInterval启动一个永远循环的循环 - 每次调用scrollToBottom之间的休眠时间为第二。然后我可以通过发出以下命令 - 手动 - 在不再加载内容时将其终止:

window.clearInterval(kill_ID);

这显然不是解决这个问题的最好方法。因此,必须有一种更好的方法来完成任务,而无需手动终止滚动过程。

但是在Javascript中,Python逻辑对我来说似乎不起作用。任何人都会给我一些关于如何实现这一点的指示 - 我认为 - 基本任务?提前谢谢。

更新 由于显然没有简单的解决方案,我使用了一个低技术解决方案并添加了一个eventListener,当我点击鼠标时触发滚动(触发clearInterval)。

因此需要一个额外的代码片段 - fx作为书签 - 只需要:

window.addEventListener('click', function kill(){window.clearInterval(kill_ID)})

感谢大家提供的有用评论。

2 个答案:

答案 0 :(得分:0)

你的方法是正确的,我认为(我可能是错的)如果你不想使用async/await方法,那就尽可能好。

使用async/await,您可以定义一个循环,如下所示:

async function toTheBottom() {
  while (check if height has changed) {
    window.scrollTo(0, document.body.scrollHeight);
    await sleep(1000);
  }
}

睡眠可能被定义为:

function sleep(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms);
  });
}

兼容性:https://caniuse.com/#feat=async-functions

答案 1 :(得分:0)

如果我理解你的问题,你想在窗口滚动时做某事,然后根据那个做某事。您应该可以通过eventListeners

执行此操作
window.addEventListener('scroll', event => {
  // Do your checks to see if you need to
  // do your work or not
  if (doWork()) {
    doSomethingElse()
  }
})

Here is a jsfiddle我认为你做的是什么样的例子

如果您想添加依赖项,这将变得更容易:

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
<script>
  const { Observable } = Rx

  const scrollStream = Observable.fromEvent(window, 'scroll')

  const isTheScrollICareAboutSubscription = scrollStream
    .filter(e => {
      // return true or false if this is
      // an event we care about
      return doWork(e)
    })
    .subscribe(doSomethingElse)
</script>