我对Javascript很新,并注意到这个奇怪的问题出现了。
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
for (i = 0; i <= Level1CatsLen-1; i++) {
var ID1 = Level1Cats[i].id;
var temp1 = Level1Cats[i].innerHTML;
temp1.replace(/&/gi, "&").replace(/<[^>]*>/gi, "");
function GoToLevel2(callback) { //GO TO NEXT LEVEL!
dispatchMouseEvent(Level1Cats[i], "mouseover", true, true);
dispatchMouseEvent(Level1Cats[i], "click", true, true);
}
function GetLevel2() { //GET NEXT LEVEL
var Level2Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry");
return Level2Cats.length;
}
setTimeout(function() { //RUN IT WITH TIMING
GoToLevel2();
}, 100);
var Level2CatsLen = GetLevel2();
}
当代码执行时,它会给我一个错误(无法读取未定义的属性'dispatchEvent') 我知道这是因为函数中的i似乎不起作用。如果我只是用int值1替换它,它将执行并按预期点击cat 1,16次。
我本以为这应该有用,有什么想法我可以解决它吗?
答案 0 :(得分:0)
在循环内部,当GoToLevel2
为i
时,会创建一个闭包i
,关闭变量1
。然后循环遍历,i
递增到2
,循环终止。
然后你的setTimeout
在100ms后开火,并调用你的关闭。它仍然记得有一个变量i
,但它现在包含2
。 Level1Cats[2]
未定义,您收到错误。
标准解决方案是将循环的内容包含在另一个不会关闭i
的自我评估函数中:
for (i = 0; i <= Level1CatsLen-1; i++) {
(function(i) {
// ...
})(i);
}
(另请注意setTimeout(function() { GoToLevel2(); }, 200)
与setTimeout(GoToLevel2, 200)
相同,但效率低于{{1}}。)