我的代码:
setInterval(function(){
$("#nor").click();//点击“查询”按钮
var jj=0;
var cxTimer=setInterval(function(){
aa=$("td[field='createBy'][style!='background-color:#0066FF']").siblings().find(".btn-text")
if(aa.length>0){
aa.click();//此处点击所有筛选出的商品的".btn-text"按钮,一次可打开几个商品的链接
clearInterval(cxTimer);
};
if(jj==160){ clearInterval(cxTimer);};//10毫秒间隔判断100次共计1000毫秒,如果没有商品出现则退出
},5);
}, Math.random()*318+700)// 时间间隔不能小于800毫秒
问题:当点击“查询”按钮后,如果商品出现,假定出现了2件商品,aa.click()会对同一商品打开8个至10多个链接【重复点击同一商品了】,似乎clearInterval(cxTimer)代码不起作用。请问如何解决重复点击同一商品链接的问题
点击的时候给点击的元素标签添加一个属性标识,下面的案例是添加了class作为标识,下次点击的时候就不获取有该class的元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.red {
color: red;
}
</style>
</head>
<body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
function fn(e) {
e.target.setAttribute("class", "red");
}
setInterval(() => {
const div = document.createElement("div");
div.innerHTML = "test";
div.setAttribute("onclick", "fn(event)");
document.body.append(div);
let num = 0;
const timer = setInterval(() => {
const divs = $("div").not($(".red"));
console.log("divs", divs);
divs.click();
num++;
if (num === 10) {
clearInterval(timer);
}
}, 2000);
}, 3000);
</script>
</body>
</html>
两个setinterval套在一起应该有问题,最外层setinterval可以说自始至终是一个,但里面那个应该就不是了,里面那个可能会被外面那个不断重复创建,可能变成难以预料的定时器(可能会变成多个重复的,因为最外层进来的时候没有先把里面的clear掉马上又创建了),像你这句代码:aa=$("td[field='createBy'][style!='background-color:#0066FF']").siblings().find(".btn-text"),能拿到这些按钮那就可以在确定点击了可以控制它们的样式display为none,应该下次就拿不出来了,建议嵌套的setinterval可以分离单独的执行,各行其事,通过共同全局参数来标记调控两个关联起来就好
创建新定时器前无条件停止上一个定时器, 让定时器保持只有一个
var cxTimer=null; //定时器id变量放外面
setInterval(function(){
$("#nor").click();//点击“查询”按钮
var jj=0;
clearInterval(cxTimer); //创建新定时器前无条件停止上一个定时器, 让定时器保持只有一个
cxTimer=setInterval(function(){
aa=$("td[field='createBy'][style!='background-color:#0066FF']").siblings().find(".btn-text")
if(aa.length>0){
aa.click();//此处点击所有筛选出的商品的".btn-text"按钮,一次可打开几个商品的链接
clearInterval(cxTimer);
};
jj++; //你少了jj++
if(jj==160){ clearInterval(cxTimer);};//10毫秒间隔判断100次共计1000毫秒,如果没有商品出现则退出
},5);
}, Math.random()*318+700)// 时间间隔不能小于800毫秒
感谢各位老师的指点。
老师们的代码都很复杂,虽然没有采用,但您的方案启发了我,最后我是在点击商品后立即再点击查询按钮,这样前面点击的商品已经被锁定排除在本次点击之外了,这就避免了重复点击