所以基本上我有一组代码可以找到我的所有类别。它会点击它们并获取它下面的所有内容。
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(/&/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(/&/, "&").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的数量。知道为什么吗?
答案 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);
}