【问题标题】:How do I run the code in a loop until a click has been performed?在执行点击之前,如何循环运行代码?
【发布时间】:2021-08-06 15:33:53
【问题描述】:

我正在尝试在我的国家/地区预订疫苗。此代码应用过滤器,然后在有疫苗可用时单击插槽。

前 3 行选择过滤器,最后一行点击可用插槽。

document.querySelector('.pin-search-btn.district-search.md.button.button-solid.ion-activatable.ion-focusable.hydrated').click()
setTimeout(() => {
  document.querySelector('#c1').click()
}, 1000);
setTimeout(() => {
  document.querySelector('#c5').click()
  document.querySelectorAll('.vaccine-box').forEach(function(item) {
    if (item.getElementsByTagName('a')[0].innerHTML !== ' Booked ' && item.getElementsByTagName('a')[0].innerHTML !== ' NA ') {
      item.getElementsByTagName('a')[0].click()
    }
  })
}, 2000);
<-- html needed -->

我想在 2 秒的时间间隔内循环运行此代码,直到执行最终点击。 item.getElementsByTagName('a')[0].click()

P.S:我在 Chrome 上的开发者工具中运行此程序,我不知道该信息是否与此处相关。

【问题讨论】:

  • 发布 HTML 可能会有所帮助,以便我们更好地为您提供帮助。请比“执行点击”多解释一下——你真正想做什么?
  • 我还建议您不要省略分号,因为它总有一天会出现一个难以找到的错误(在此处粘贴您的代码:jshint.com
  • 例如,重复点击同一元素会给您/做些什么?
  • @MarkSchultheiss 该页面存在第一次点击时无法加载的错误。

标签: javascript html jquery-selectors


【解决方案1】:

直观地说,我建议保留一个布尔值hasClickedSlot = false,一旦点击了一个插槽,你就会更新它。在再调用setTimeout 2 秒之前,请确保!hasClickedSlot 仍然存在。

这可能看起来像:

let hasClickedSlot = false;

function clickButton() {
  document.querySelector('.pin-search-btn.district-search.md.button.button-solid.ion-activatable.ion-focusable.hydrated').click();
  
  // after 1 second, click on the C1 button
  setTimeout(clickC1, 1000);
}

function clickC1() {
  document.querySelector('#c1').click();
  
  // after 2 seconds, try to click on a slot
  setTimeout(tryClickSlot, 2000);
}


function tryClickSlot() {
  document.querySelector('#c5').click();
  document.querySelectorAll('.vaccine-box').forEach(function(item) {
    if (item.getElementsByTagName('a')[0].innerHTML !== ' Booked ' && item.getElementsByTagName('a')[0].innerHTML !== ' NA ') {
      item.getElementsByTagName('a')[0].click()
      hasClickedSlot = true;
    }
  });

  // if no slot was clicked yet, do it again
  if (!hasClickedSlot) {
    clickButton();
  }
}

// start the process
clickButton();

这段代码的缺点是构建了一个调用堆栈,因为函数不会返回而是继续堆叠。

编辑:由于函数在调用 setTimeout 后返回,因此没有构建堆栈调用(例如在递归期间)。

【讨论】:

  • 这非常有效,先生!非常感谢。虽然我不明白函数调用堆叠的含义可能是什么。我可以让它返回一些东西并且从不使用返回的值吗?
  • 别介意那句话。我只是测试了一下,设置超时后函数返回。这应该适合你。真的很烦人,您需要这种方法才能接种疫苗!祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多