setTimeout 似乎被循环忽略了

setTimeout seems to be ignored by loop

本文关键字:循环 setTimeout      更新时间:2023-09-26

所以基本上我有一组代码可以找到我所有的类别。它将单击它们并获取其下的所有内容。

    var Category = [];
var ID1;
var ID2;
var Level2CatsLen

var dispatchMouseEvent = function(target, var_args) {
    var e = document.createEvent("MouseEvents");
    e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
    target.dispatchEvent(e);
}
var Level1Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry "); //GETTING LEVEL 1 CATS
var Level1CatsLen = Level1Cats.length; //GETTING LEVEL 1 CAT LEN
    function GoToLevel2(i) { //GO TO NEXT LEVEL!
    setTimeout(function() {
    dispatchMouseEvent(Level1Cats[i], "mouseover", true, true);
    dispatchMouseEvent(Level1Cats[i], "click", true, true);
    }, 3000);
    }

    function GetLevel2() { //GET NEXT LEVEL
    setTimeout(function() {    
    Level2Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry");
    console.log("Level1CatLen: "+Level1CatsLen);
    console.log("Level2CatLen: "+Level2CatsLen);
    var Level2CatsLen = Level2Cats.length }, 3000);
    };

for (i = 0; i <= Level1CatsLen-1; i++) {
console.log(Level1CatsLen);
    var ID1 = Level1Cats[i].id;
    var temp1 = Level1Cats[i].innerHTML;
    temp1.replace(/&amp;/gi, "&").replace(/<[^>]*>/gi, "");
    setTimeout(function() {GoToLevel2(i)}, 10000);
    setTimeout(function() {GetLevel2()},20000); //RUN IT WITH TIMING

    // END OF LEVEL 1
    var extracats2 = Level2CatsLen - Level1CatsLen;
    if (extracats2 !== 2 || extracats2 !== 0) {
        for (ii = 0; ii < extracats2; ii++) { //LEVEL 2
        ID2 = Level2Cats[ii+Level1CatsLen].id;
        var temp2 = Level2Cats[ii+Level1CatsLen].innerHTML;
        temp2.replace(/&amp;/, "&").replace(/<[^>]*>/gi, "");
var Level2Children = []; 
for (l = 0; l < level1CatsLen; l++) {
    Level2Children.push(Level2Cats[l].id);
} 
//DO SOMETHING WITH CATEGORIES - Level 1
Category.push({Name: temp1, ID: ID2, ParentID: 'null', ChildrenIDs: Level2Children});
//FINISH
        }}}

我已经分配了两次设置超时只是为了玩东西。但是我遇到的问题是GoToLevel2执行然后获取类别,并试图立即获取它,自然找不到任何东西。尽管设置超时似乎没有效果。它会减慢最初的速度,然后非常快速地向控制台发送垃圾邮件,以获取那里的 Level1Cat 数量。知道为什么吗?

您的变量i是全局的,并且被覆盖的次数可能比您想象的要多。此外,它稍后被传递给GoToLevel2(),并且具有与您想象的不同值。我会先改变它,看看问题是否仍然存在。

function GoToLevel2(n) { //GO TO NEXT LEVEL!
  setTimeout(function() {
    dispatchMouseEvent(Level1Cats[n], "mouseover", true, true);
    dispatchMouseEvent(Level1Cats[n], "click", true, true);
  }, 3000);
}
// ...
for (var i = 0; i <= Level1CatsLen-1; i++) {
  // ...
  setTimeout(function() {GoToLevel2(i)}, 10000);
  // ...
}

请注意 for 循环中的var,这会将i的范围限制为for -循环。此外,我将其更改为n in GoToLevel2(n)以防止读者混淆(对于浏览器来说应该是必需的)。

您在 setTimeout 中使用循环计数器 ('i' var),并且当超时值 i 已经递增后触发代码时。下面是在循环中使用 setTimeout 的示例。

for (var i=0; i < 10; i++)
{
    (
        function(i)
        {
            setTimeout(
                function()
                {
                    alert(i);
                }, 50
            );
        }
    )(i);
}