javascript - 如何在不减慢网页速度的情况下减慢自定义 Javascript 扩展程序的速度?
问题描述
我有一个自定义 javascript 扩展,可以解决网站上的调查。不幸的是,它工作得有点太好了——它检查了复选框并且点击下一个太快了。该网站检测到这一点,意识到它是一个正在解决调查的机器人,并发送一个错误,说有太多的请求。我可以使用哪些代码来减慢不会停止网站的扩展程序?
我特别尝试使用我自己编写的 sleep() 函数,它基本上完全停止了 javascript 程序。我只是在 checkBox 方法之前写了一个快速的“sleep(1500)”。这实际上最终停止了整个页面上的 javascript,这与我想要的完全相反。
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
我的目标是让扩展等待大约 3 到 4 秒,然后再选中该框并点击下一步,之后,它会再等待 3 到 4 秒,依此类推。实际发生的事情是在花哨的动画之前网页已完成的复选框,扩展程序已选中右侧框并点击下一步。如前所述,这太快了。基本上,我想暂停扩展 3 秒,同时让网页上的 javascript 继续工作。
解决方案
您可以通过三种方式实现这一目标。
第一种方法是跳过创建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 不支持 async/await,因此如果您希望支持它,最好的方法是使用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
});
推荐阅读
- java - 如何将具有不同空格数量的字符串分成两部分?
- vb.net - 在比较数字之前检查数字是否为整数在 vb net 中不起作用
- azure - 在 Azure 门户中导入带有链接服务的管道
- c - C - 从 .txt 文件中读取并将字符存储在数组中
- c++ - 如何使用 cin 进行重复输入?
- angular - 通过 < 和 > 比较两个对象
- php - WooCommerce 购物车未正确显示小数位数的价格
- angular - 如何在Angular 9中使用paramMap从嵌套在组件中的属性获取数据
- c++ - 1.显示函数中的最后一个数据被打印2次 2.删除函数中的数据没有被删除并且Attend2.txt文件没有被删除
- python - 如何在 docker-compose 中将 2 个正在运行的容器相互连接?