我想创建一个随机选择器'函数迭代数组一段时间(例如:3秒,5秒)的行为,同时在整个迭代过程中快速显示所有数组元素,直到迭代结束。想象一下,看到所有元素一个接一个地显示在标签上,直到它最终停在一个元素上。
到目前为止我的代码:
var places = ["Curry Leaf", "Subway", "Burger King"];
function execute_randomizer() {
var place_label = document.getElementById("place_label");
for (var i = 0; i < 100; i++) {
var selected_place = places[Math.floor(Math.random() * places.length)];
setTimeout(function () {
place_label.innerText = selected_place;
}, 400);
}
}
这会贯穿迭代并在循环完成时显示一个元素,但它不会显示每个迭代的元素。我该如何修改?
修改
即使有3个元素,动画也必须重新遍历数组,直到持续时间完成
答案 0 :(得分:1)
您的for
在setTimeout
运行之前完成迭代,然后传递给setTimeout
的函数使用selected_place
的最后一个值运行100次。
有关setTimeout in for-loop does not print consecutive values
中此行为的详情我注意到的另一个问题是你的setTimeout将在400ms后触发,因为for
循环将在大约1 ms内完成,传递给setTimeout
的函数将一个接一个地触发100次两者之间的延迟,为此,我将setTimeout的延迟参数从400
替换为400 * i
。
var places = ["Curry Leaf", "Subway", "Burger King"];
function execute_randomizer() {
var place_label = document.getElementById("place_label");
for (var i = 0; i < 100; i++) {
var selected_place = places[Math.floor(Math.random() * places.length)];
(function(selected_place){
setTimeout(function () {
place_label.innerText = selected_place;
}, 400 * i);
})(selected_place);
}
}
execute_randomizer();
<span id="place_label"></span>
答案 1 :(得分:1)
您可以对值使用闭包,并为每次超时使用不同的时间。
var places = ["Curry Leaf", "Subway", "Burger King"];
function execute_randomizer() {
var place_label = document.getElementById("place_label");
for (var i = 0; i < 10; i++) {
var selected_place = places[Math.floor(Math.random() * places.length)];
setTimeout(function (value) {
return function () {
place_label.innerText = value;
};
}(selected_place), i * 100);
}
}
execute_randomizer();
&#13;
<div id="place_label"></div>
&#13;
对于第一次运行,您可以显示每个元素,然后获取最后一个值的随机元素。
function execute_randomizer() {
function cb (value) {
return function () {
place_label.innerText = value;
};
}
var place_label = document.getElementById("place_label");
place_label.innerText = '';
for (var i = 0; i < places.length; i++) {
setTimeout(cb(places[i]), 200 + i * 200);
}
setTimeout(cb(places[Math.floor(Math.random() * places.length)]), 200 + places.length * 200);
}
var places = ["Curry Leaf", "Subway", "Burger King"];
execute_randomizer();
&#13;
<div id="place_label"></div>
&#13;
答案 2 :(得分:0)
你应该改变你的循环,因为你现在循环100次,可能是一毫秒,并且在同一时间再次订购100
更改文本。
所以更好的是等待超时400 ms
,然后进行下一次迭代。
请记住超时是异步的。
答案 3 :(得分:0)
我认为如果将整个函数置于超时状态可能会更好。 (我不确定并且没有测试,但这就是我想要尝试的。)
我的意思是你只需要构建一个创建随机函数并填充你的字段的函数。之后你再次调用同一个函数超时+保留一个你作为参数传递的计数器。
下面我的意思的一个例子:(没有测试)
var places = ["Curry Leaf", "Subway", "Burger King"];
execute_randomizer(0); /* Start for the first time */
function execute_randomizer(times) {
if(times == 100)
return; /* stop execution */
var place_label = document.getElementById("place_label");
var selected_place = places[Math.floor(Math.random() * places.length)];
place_label.innerText = selected_place;
setTimeout(function () {
execute_randomizer(times+1)
}, 400);
}