我正在尝试在我的javascript中创建以下功能:
$("mySelector").each(function(){
// Do something (e.g. change div class attribute)
// call to MyFunction(), the iteration will stop here as long as it will take for myFunction to complete
});
function myFunction()
{
// Do something for e.g. 5 seconds
}
我的问题是如何在myFunction()的持续时间内停止每次迭代?
答案 0 :(得分:3)
不,那是不可能的。您必须以不同的方式对其进行编码,可能使用基于.each的当前索引的setTimeout。
$("mySelector").each(function(i){
// Do something (e.g. change div class attribute)
// call to MyFunction(), the iteration will stop here as long as it will take for myFunction to complete
setTimeout(myFunction,i*5000);
});
function myFunction()
{
// Do something for e.g. 5 seconds
}
编辑:你也可以排队:http://jsfiddle.net/9Bm9p/6/
$(document).ready(function () {
var divs = $(".test");
var queue = $("<div />");
divs.each(function(){
var _this = this;
queue.queue(function(next) {
myFunction.call(_this,next);
});
});
});
function myFunction(next) {
// do stuff
$(this).doSomething();
// simulate asynchronous event
var self = this;
setTimeout(function(){
console.log(self.id);
// go to next item in the queue
next();
},2000);
}
答案 1 :(得分:2)
这是一个我认为会做你需要的jsFiddle:
您只需要将选择器替换为您使用的选项。
正在发生的“循环”将等待myFunction
完成,然后再转到下一个元素。我在myFunction
内添加了setTimeout来模拟它需要一段时间。如果您正在使用异步事物(例如AJAX请求),则需要将调用放在myFunction
方法内的complete
...或动画的回调中。
但正如有人已经评论过,如果myFunction
中的所有内容都是同步的,那么您应该可以按原样使用它。如果您希望此过程是异步的,或者myFunction
中的内容是异步的,则不能使用for循环或.each()。
答案 2 :(得分:1)
(function () {
"use strict";
var step = 0;
var content = $("mySelector");
var max = content.length;
var speed = 5000; // ms
var handle = setInterval(function () {
step++;
if (step >= max) {
clearInterval(handle);
} else {
var item = content[step];
// do something
}
}, speed);
}());
setInterval
将每隔n毫秒执行一次,clearInterval
将在您完成后停止它。这不会锁定浏览器(假设您的“做某事”也没有)。 FRAGILE:它假定$("mySelector")
的结果在任务期间有效。如果情况不是这样,那么在do something
内,然后再次验证item
。