我有一个自定义的javascript扩展程序,可以解决网站上的调查。不幸的是,它的工作原理有点太好了-它选中了复选框,然后很快就点击了下一个。该网站检测到这一点,意识到这是一个解决调查的机器人,然后发送错误消息,指出请求过多。我可以使用什么代码来减慢不会停止网站的扩展程序?
我专门尝试使用我自己编写的sleep()函数,该函数基本上完全停止了javascript程序。我只是在checkBox方法之前写了一个快速的“ sleep(1500)”。实际上,这最终会导致整个页面停止javascript,这与我想要的完全相反。
setInterval
我的目标是让扩展程序等待大约3至4秒钟,然后再选中该框并单击,然后再等待3到4秒钟,依此类推。实际发生的事情是在花哨之前该网页已完成的复选框的动画,该扩展程序已经选中了右侧的框,然后点击了下一步。如前所述,这太快了。基本上,我想让扩展程序停顿3秒钟,同时让网页上的javascript继续运行。
答案 0 :(得分:-1)
有三种方法可以实现这一目标。
第一种方法是跳过制作sleep()
函数,而只使用setTimeout()
。
// code before wait
setTimeout(()=>{
// code after wait
}, 1500);
另一种方法是使用async / await,如下所示。
// Promises require async/await to work in JavaScript
async function sleep(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms); // this will call the resolve() function after the time has passed
});
}
// You cannot use await in a non-async function, be sure to change that before adding this
await sleep(1500);
但是,IE不支持异步/等待,因此,如果您希望支持异步/等待,最好的方法是使用setInterval()
。必须将时间间隔分配给变量,否则您将无法停止它,并可能导致某些问题。
function sleep(ms, todo) {
var started = Date.now(); // get current time before wait
var temp = setInterval(()=>{
if ((Date.now() - started) > 1500) {
clearInterval(temp); // stops the interval from repeating
// avoid "X is not a function" errors
if (typeof todo === 'function') todo(); // perform the code to do after the wait
}
}, 50);
}
// your code before the sleep function
sleep(1500, function() {
// the code after the sleep function
});