Javascript 如何在循环中运行代码,直到执行单击为止?

Javascript 如何在循环中运行代码,直到执行单击为止?,javascript,html,jquery-selectors,Javascript,Html,Jquery Selectors,我想在我的国家订一种疫苗。此代码应用过滤器,然后单击一个插槽(如果疫苗可用) 前3行选择过滤器,最后一行单击可用插槽 document.querySelector('.pin search btn.district search.md.button.button solid.ion activatable.ion focusable.hydrated')。单击() 设置超时(()=>{ document.querySelector('#c1')。单击() }, 1000); 设置超时(()=>

我想在我的国家订一种疫苗。此代码应用过滤器,然后单击一个插槽(如果疫苗可用)

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

document.querySelector('.pin search btn.district search.md.button.button solid.ion activatable.ion focusable.hydrated')。单击()
设置超时(()=>{
document.querySelector('#c1')。单击()
}, 1000);
设置超时(()=>{
document.querySelector('#c5')。单击()
document.querySelectorAll('.vaccine box').forEach(函数(项){
if(item.getElementsByTagName('a')[0].innerHTML!='Booked'&&item.getElementsByTagName('a')[0].innerHTML!='NA'){
item.getElementsByTagName('a')[0]。单击()
}
})
}, 2000);

直觉上,我建议保留一个布尔值
hasClickedSlot=false
,一旦单击了一个插槽,您就可以更新它。再调用
setTimeout
两秒钟之前,请确保
!hasClickedSlot
仍然有效

这可能看起来像:

让hasClickedSlot=false;
函数clickButton(){
document.querySelector('.pin search btn.district search.md.button.button solid.ion activatable.ion focusable.hydrated')。单击();
//1秒后,单击C1按钮
设置超时(点击C1,1000);
}
函数clickC1(){
document.querySelector('#c1')。单击();
//2秒钟后,尝试单击插槽
设置超时(tryClickSlot,2000);
}
函数tryClickSlot(){
document.querySelector('#c5')。单击();
document.querySelectorAll('.vaccine box').forEach(函数(项){
if(item.getElementsByTagName('a')[0].innerHTML!='Booked'&&item.getElementsByTagName('a')[0].innerHTML!='NA'){
item.getElementsByTagName('a')[0]。单击()
hasClickedSlot=true;
}
});
//如果尚未单击插槽,请再次单击
如果(!hasClickedSlot){
单击按钮();
}
}
//开始这个过程
单击按钮();
这段代码的缺点是构建了调用堆栈,因为函数不返回,而是保持堆栈


编辑:由于函数在调用
setTimeout
后返回,因此不会生成堆栈调用(例如,在递归过程中会这样)。

发布HTML也可能会有所帮助,这样我们可以更好地为您提供帮助。请多解释一下“执行点击”——你到底想做什么?我还建议你不要漏掉分号,因为总有一天它会显示一个难以发现的错误(将您的代码粘贴到此处:例如,重复单击同一元素会给您/为您做什么?@markschultheis该页面有一个错误,在第一次单击时无法加载。这非常有效,先生!非常感谢。尽管我不明白函数调用叠加的含义。我能让它返回一些内容吗永远不要使用返回值?别介意那句话。我只是测试了一点,函数在设置超时后返回。这应该对你有用。真烦人,你需要这样的方法才能得到疫苗!祝你好运!