function createDivs(){
var styleHash = {};
vertical=0;
horizontal=0;
var h;
var aDiv
var colour;
var groupStyle;
for(key in elHash){
h=elArr[0][zIndex[key]]/elHash[key];
colour = randomColor();
setLocation(h,elHash[key]);
var container = document.getElementById('container');
styleElements(container,'width',(scrnWidth-40)+'px');
styleElements(container,'height',(scrnHeight-200)+'px');
aDiv = implementDOMelement(container,'div', '');
groupStyle = function() {
styleElements(aDiv ,vposition,vertical+'px');
styleElements(aDiv ,hposition,horizontal+'px');
styleElements(aDiv ,'backgroundColor', colour);
styleElements(aDiv ,'width', elHash[key]+'px');
styleElements(aDiv ,'height', h+'px');
styleElements(aDiv ,'zIndex', zIndex[key]);
if (colour =='#ffffff'){styleElements(aDiv ,'border', 'solid');}
}
setTimeout( groupStyle ,1000);
}
}
function randomColor(){
var colorR;
var colorG;
var colorB;
colorR = randomNumber(0,255);
colorG = randomNumber(0,255);
colorB = randomNumber(0,255);
return 'rgb('+colorR+','+colorG+','+colorB+')';
}
function implementDOMelement(parentNode, elementType,innHTML, attributes ){//
var element = document.createElement(elementType);
for (key in attributes){
element.setAttribute(key,attributes[key]);
}
element.innerHTML = innHTML;
parentNode.appendChild(element);
return element;
}
function styleElements(aNode,cssProperty,cssVal){
aNode.style[cssProperty]=cssVal;
}
为什么'setTimeout'只在每次迭代时执行一次? 我的目标是每秒弹出一个div! 没有放入所有代码,但没有setTimeOut和groupStyle(代码不在函数中)它可以正常工作
10x求助,BR
答案 0 :(得分:3)
它在每个循环上执行,但所有10个循环都在同一时间执行。循环非常快地遍历列表,当它完成循环时,可能没有发生一次超时。
如果您希望每1秒执行aFunc
,则使用setInterval
或者在每次迭代后将setTimeout
时间增加1000。
答案 1 :(得分:2)
var i = 0;
for(key in hash){
var aFunc = function() {}
setTimeout(aFunc, 1000 * i++);
}
你的函数调用全部发生在彼此之后,因为for
循环没有时间运行,因此所有超时都设置为大致相同的时间。您需要在每次迭代时增加超时以获得每秒一次的效果。或者您使用setInterval()
/ clearInterval()
。
答案 2 :(得分:1)
看看这个,它可能就是你要找的答案:
setTimeout in for-loop does not print consecutive values
在你的情况下:aDiv总是指向循环的最后一个div。这是我的猜测为什么它看起来只会触发一次。
您的代码的简单解决方案应该是这样的:
groupStyle = function() {
styleElements(aDiv ,vposition,vertical+'px');
styleElements(aDiv ,hposition,horizontal+'px');
styleElements(aDiv ,'backgroundColor', colour);
styleElements(aDiv ,'width', elHash[key]+'px');
styleElements(aDiv ,'height', h+'px');
styleElements(aDiv ,'zIndex', zIndex[key]);
if (colour =='#ffffff'){styleElements(aDiv ,'border', 'solid');}
}
setTimeout( groupStyle ,1000);
//replaced with:
// I will assume vposition and hposition were supposed to be strings not variables
doGroupStyle(aDiv, vertical, horizontal, elHash, key, zIndex, colour);
// then create the doGroupStyle function
function doGroupStyle(aDiv, vertical, horizontal, elHash, key, zIndex, colour) {
setTimeout(function() {
styleElements(aDiv ,'vposition',vertical+'px');
styleElements(aDiv ,'hposition',horizontal+'px');
styleElements(aDiv ,'backgroundColor', colour);
styleElements(aDiv ,'width', elHash[key]+'px');
styleElements(aDiv ,'height', h+'px');
styleElements(aDiv ,'zIndex', zIndex[key]);
if (colour =='#ffffff'){styleElements(aDiv ,'border', 'solid');
}, 1000 * key);
}
}
// or an alternative approach as passcod suggested:
(function(aDiv, vertical, horizontal, colour, elHash, key, h, zIndex) {
groupStyle = function() {
styleElements(aDiv ,'vposition',vertical+'px');
styleElements(aDiv ,'hposition',horizontal+'px');
styleElements(aDiv ,'backgroundColor', colour);
styleElements(aDiv ,'width', elHash[key]+'px');
styleElements(aDiv ,'height', h+'px');
styleElements(aDiv ,'zIndex', zIndex[key]);
if (colour =='#ffffff'){styleElements(aDiv ,'border', 'solid');}
};
setTimeout(groupStyle ,1000 * key);
})(aDiv, vertical, horizontal, colour, elHash, key, h, zIndex);
尚未对其进行测试,因此您可能需要对其进行一些修改。但这就是背后的想法。