我想知道为什么在下面的代码中,当函数setInterval死掉时,会删除coupleFound数组的元素。想法是,进入一个元素并检查她的标签名称“ai”。
当他接受这个标签时,他会从父母那里复制整个元素,然后放入coupleFound数组。它工作,但只在设置Interval功能内!我不明白因为我在函数之外声明了数组!我相信这是因为“设置间隔”不同步,但我不知道如何解决这个问题!
var clicked = 0,
totalClicks = 3,
index = 0,
listIds = new Array("289657", "2680235", "1597254", "269621"),
coupleFound = new Array( ),
videos = document.getElementById( "videos_list" );
var interval = setInterval(function( ) {
coupleList = videos.getElementsByTagName( "a" );
for(var i = coupleList.length; i--;) {
for(j=0; j < listIds.length; j++) {
if(coupleList[i].getAttribute( "ai" ) == listIds[j]) {
coupleFound[index] = coupleList[i].parentNode;
index++;
break;
}
}
videos.removeChild( videos.lastChild );
}
document.getElementById('btnMoreVideos').click();
clicked++;
if(clicked >= totalClicks) {
clearInterval( interval );
alert("I'm inside of the function. The length is:" + coupleFound.length)
}
}, 1000);
alert("The length of the array is:" + coupleFound.length);
我该怎么做才能解决这个问题?
答案 0 :(得分:0)
你或多或少是正确的。 setInterval
是异步的。在setInterval第三次触发之前,您的最后一行代码将立即运行。
在JavaScript中没有好的睡眠/阻止方法。您必须重新构建代码,以便它按您想要的顺序运行。通常这意味着使用回调。即,从if(clicked >= totalClicks)
块内部调用一个函数来执行您想要的操作,而不是将其放在setInterval
之后。
如,
var clicked = 0,
totalClicks = 3,
index = 0,
listIds = new Array("289657", "2680235", "1597254", "269621"),
coupleFound = new Array( ),
videos = document.getElementById( "videos_list" );
function allDone() {
alert("The length of the array is:" + coupleFound.length);
}
var interval = setInterval(function( ) {
coupleList = videos.getElementsByTagName( "a" );
for(var i = coupleList.length; i--;) {
for(j=0; j < listIds.length; j++) {
if(coupleList[i].getAttribute( "ai" ) == listIds[j]) {
coupleFound[index] = coupleList[i].parentNode;
index++;
break;
}
}
videos.removeChild( videos.lastChild );
}
document.getElementById('btnMoreVideos').click();
clicked++;
if(clicked >= totalClicks) {
clearInterval( interval );
alert("I'm inside of the function. The length is:" + coupleFound.length);
allDone();
}
}, 1000);
尽管你应该尽可能地避免使用全局变量。如果您不需要访问太多变量,可以将coupleFound
或其长度传递给allDone
。