我试图在javascript中向下滚动一些内容,但是,在执行时,它只是说了一下并立即显示所有内容。所以它没有使用$("#Menu").html('')
函数清除,setTimeout(function {},500)
只是为整个页面而不是代码段设置超时。
var MenuData = [
{'Name':'pictures','x':'30'},
{'Name':'blog','x':'50'},
{'Name':'contact','x':'42'}
]
;
var PositionArray = new Array();
$(document).ready(function () {
for (var count = 0; count < 1000; count++) {
$("#Menu").html('');
if (PositionArray[count] != null) {
PositionArray[count]++;
} else {
PositionArray[count] = 0;
}
setTimeout(function () {
for (var i in MenuData) {
$("#Menu").append('<div style="position:relative; left:' + MenuData[i].x + 'px; top:' + PositionArray[i] + 'px; ">123</div>');
}
}, 500);
}
});
这是小提琴:http://jsfiddle.net/LbjUP/
编辑:代码中存在一些不适用于该问题的错误。这是新的:http://jsfiddle.net/LbjUP/1/,我刚将PositionArray [count]移动到setTimeout函数作为PositionArray [i]
答案 0 :(得分:2)
如评论中所述,您将同时创建1000个超时500毫秒 - 在500毫秒后,所有这些超时都将被执行。你想要的是增加每个预定功能的超时时间:
setTimeout(function() {
// do something
}, count * 500);
然而,一次创建1000个超时并不是一个好主意。最好使用setInterval
或递归调用setTimeout
,直到达到1000的计数,这样你一次只能有一个活动的超时。
var count = 0;
function update() {
// do something
if (++count < 1000)
setTimeout(update, 500);
// else everything is done
}
update();
此外,如果您打算在循环中创建超时,请确保在循环运行后访问计数器变量时familiar with closures及其行为。
答案 1 :(得分:0)
尝试
function recurse ( cnt ) {
for (var i in MenuData) {
$("#Menu").append('<div style="position:relative; left:' + MenuData[i].x + 'px; top:' + PositionArray[i] + 'px; ">123</div>');
}
if (cnt < 1000){
setTimeout(function () { recurse(cnt + 1); }, 500);
}
}
$("#Menu").html('');
if (PositionArray[count] != null) {
PositionArray[count]++;
} else {
PositionArray[count] = 0;
}
recurse(0);