我如何 运行 循环中的代码直到执行点击?
How do I run the code in a loop until a click has been performed?
我正在尝试在我的国家预订疫苗。此代码应用过滤器,然后在有疫苗可用时单击插槽。
前 3 行 select 过滤器和最后一行点击可用广告位。
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 上的开发人员工具中 运行 宁此,我不知道该信息是否与此处相关。
凭直觉,我建议保留一个布尔值 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();
此代码的缺点特别是构建了调用堆栈,因为函数不会return而是保持堆栈。
编辑:由于函数 return 在调用 setTimeout
之后没有构建堆栈调用(例如在递归期间)。
我正在尝试在我的国家预订疫苗。此代码应用过滤器,然后在有疫苗可用时单击插槽。
前 3 行 select 过滤器和最后一行点击可用广告位。
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 上的开发人员工具中 运行 宁此,我不知道该信息是否与此处相关。
凭直觉,我建议保留一个布尔值 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();
此代码的缺点特别是构建了调用堆栈,因为函数不会return而是保持堆栈。
编辑:由于函数 return 在调用 setTimeout
之后没有构建堆栈调用(例如在递归期间)。