loopTime似乎忽略了setTimeout

时间:2014-11-18 10:50:18

标签: javascript for-loop

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

    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
        }}}

我已经分配了两次setTimeouts来玩游戏。但我遇到的问题是GoToLevel2执行,然后获得类别,并试图直接得到它,自然无法找到任何东西。虽然setTimeout似乎没有效果。它减慢了最初的速度,然后在那之后,控制台很快就达到了Level1Cats的数量。知道为什么吗?

2 个答案:

答案 0 :(得分:0)

您的变量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);
  // ...
}

请注意var循环中的for,这会将i的范围限制为for - 循环。我还在n中将其更改为GoToLevel2(n),以防止读者混淆(浏览器不一定需要)。

答案 1 :(得分:0)

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

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