Javascript setTimeout未在更改DOM之前等待
我试图在特定时间后使用setTimeout更改某些类,但我得到的只是即时更改,而无需等待2秒钟。我做错了什么 这是JSJavascript setTimeout未在更改DOM之前等待,javascript,settimeout,Javascript,Settimeout,我试图在特定时间后使用setTimeout更改某些类,但我得到的只是即时更改,而无需等待2秒钟。我做错了什么 这是JS function addElements() { var data = ["empty","typeA","typeB","typeC"]; for(var k=0;k<data.length;k++) { var set=document.getElementById("empty"); set.setAttribute("id"
function addElements() {
var data = ["empty","typeA","typeB","typeC"];
for(var k=0;k<data.length;k++) {
var set=document.getElementById("empty");
set.setAttribute("id", "empty"+k);
if(data[k] !== "empty") {
var s = set.setAttribute("class", data[k]);
setTimeout(function() { s; }, 2000);
}
else set.setAttribute("class", data[k]);
}
}
函数加法器(){
变量数据=[“空”、“类型A”、“类型B”、“类型C”];
对于(var k=0;k当您执行var s=set.setAttribute(“class”,data[k]);
时,您正在运行setAttribute
函数。因此,您正在设置属性,然后将s
设置为返回值,即未定义的
执行s;
什么都不做。这就是为什么setTimeout(function(){s;},2000);
实际上什么都不做
您要做的是在setTimeout
中运行函数。此外,由于这将在循环完成后运行,因此需要通过闭包保存对k
的引用
var timeoutFunction = function(set, k){
return function(){
set.setAttribute("class", data[k]);
}
};
setTimeout(timeoutFunction(set, k), 2000);
当您执行var s=set.setAttribute(“class”,data[k]);
时,您正在运行setAttribute
函数。因此,您正在设置属性,然后将s
设置为返回值,返回值是未定义的
执行s;
什么都不做。这就是为什么setTimeout(function(){s;},2000);
实际上什么都不做
您要做的是在setTimeout
中运行函数。此外,由于这将在循环完成后运行,因此需要通过闭包保存对k
的引用
var timeoutFunction = function(set, k){
return function(){
set.setAttribute("class", data[k]);
}
};
setTimeout(timeoutFunction(set, k), 2000);
这是使用k
var cName = data[k];
if(cName !== "empty") {
(function(set, cName ) {
setTimeout(function() {
set.setAttribute("class", cName );
}, 2000);
})(set, cName);
}
这是使用k
var cName = data[k];
if(cName !== "empty") {
(function(set, cName ) {
setTimeout(function() {
set.setAttribute("class", cName );
}, 2000);
})(set, cName);
}
实际上,您的答案是错误的,因为k
将不是您期望的!当setTimeout运行时,k
将等于data.length
。我添加了var s,因为您说我在控制台中得到一个未定义的值,并且不会更改class@epascarello:噢!哇!让我来修。@user2035693:现在试试,我有一个s商场错误!:)谢谢。出于某种原因,@epascarello answer在我不得不做的更改中工作得更好。实际上,你的答案是错误的,因为k
将不是你所期望的!k
将等于data.length
当setTimeout运行时!我添加了var s,因为你说我在控制台中得到了一个未定义的值,而不是ch改变方向class@epascarello:噢!哇!让我来修正。@user2035693:现在试试,我有一个小错误!:)谢谢。出于某种原因,@epascarello answer在我必须做的更改中工作得更好。现在我不再得到一个未定义的值,但在2秒钟后正在更改最后一个div类,即使在控制台cName中也似乎得到了al前2秒后的l值Hoops,也需要传入集合。好的,现在唯一剩下的问题是,它在前2秒后更改所有内容,而不是每次等待2秒cName!=“空”在超时时间之外有一个if语句,这就是问题所在吗?这段代码不会出现这种情况,需要完全不同的逻辑。现在我不再得到一个未定义的值,但在2秒后会更改最后一个div类,即使在控制台中,cName似乎在前2秒之后得到所有值hoops,也需要通过设置。好的,现在唯一剩下的问题是,它在前2秒后更改所有内容,而不是每次cName都等待2秒!==“empty”那么你在超时之外得到了一个if语句,这就是问题所在吗?这个代码不会发生这种情况,需要完全不同的逻辑。