Javascript 插入';暂停';在a.每个枚举中
使用jQuery“.each()”对一组元素的每个枚举插入“暂停”的最佳/推荐方式是什么Javascript 插入';暂停';在a.每个枚举中,javascript,jquery,Javascript,Jquery,使用jQuery“.each()”对一组元素的每个枚举插入“暂停”的最佳/推荐方式是什么 setTimeout(yourFunction(),5000)可能是您想要的东西。但请记住,此函数将在5s后执行yourFunction()。如果setTimeout之后有代码,那么它仍然会立即执行,所以这取决于您想做什么。如果您真的想停止所有代码的执行,那么这是一个很难解决的问题。您可以在文档中查看一些建议的解决方案/功能。但是对于JavaScript来说,不完全锁定CPU就很难完全停止执行。< P> >
setTimeout(yourFunction(),5000)代码>可能是您想要的东西。但请记住,此函数将在5s后执行yourFunction()
。如果setTimeout之后有代码,那么它仍然会立即执行,所以这取决于您想做什么。如果您真的想停止所有代码的执行,那么这是一个很难解决的问题。您可以在文档中查看一些建议的解决方案/功能。但是对于JavaScript来说,不完全锁定CPU就很难完全停止执行。< P> >在JavaScript函数的中间没有延迟这样的延迟。
为了在下一次工作增量之前合法地延迟5秒,您需要获取作业所需的数据,将工作分成小块,设置5秒计时器,并在每个计时器滴答声中执行一块工作
下面是一个这样做的工作示例:
var objList=$('.someClass');
var-cntr=0;
var时间延迟=5000;
函数doNextIteration(){
$(objList[cntr++].html(cntr);//此处的代码:这是我在演示中显示的进度
如果(cntr<对象列表长度){
setTimeout(doNextIteration,timeDelay);
}
}
如果(objList.length>0){
doNextIteration();
}
如果您有类似的html
<div class="someClass">google</div>
<div class="someClass">facebook</div>
<div class="someClass">ARPANET</div>
这是小提琴
您可以设置自己选择的时间
或者根据您编辑的问题,这可能会有所帮助
如果出于某种原因必须使用。每个,那么这将使您非常接近,前提是您在每个迭代中没有做大量工作:
var i = 0;
$( '.someClass' ).each( function() {
setTimeout((function (el) {
// do something with 'el'
})(this), i * 5000);
i += 1;
});
但这样做(考虑到你问题的措辞)更为正确:
(function() {
var arr = $('.someclass'),
i = 0,
fn = function() {
var el = arr[i];
// do something with 'el'
i += 1;
if (i < arr.length) {
setTimeout(fn, 5000);
}
};
fn();
})();
(函数(){
var arr=$('.someclass'),
i=0,
fn=函数(){
var el=arr[i];
//用“el”做点什么
i+=1;
如果(i
从技术上讲,您不能像在代码中建模那样这样做,因为JavaScript是单线程的,通常在浏览器(或选项卡)UI线程上运行——任何睡眠/延迟都会阻止浏览器重新绘制页面,也会阻止用户与页面交互
您需要安排浏览器定期调用代码。像这样的东西可以达到目的:
var objects = $.makeArray($( '.someClass' ));
var callback;
callback = function() {
var item = objects.shift();
// Do something with item.
if (objects.length != 0) {
setTimeout(callback, 5000);
}
}
setTimeout(callback, 5000);
看
此解决方案假定您希望从最后一个项目完成处理的时间起5秒钟内处理每个项目。这意味着:
如果在处理每个项目时执行了confirm()
或其他操作,则下一个项目将在用户关闭对话框后的5秒钟内被处理
总执行时间为(5000N+T),其中N是初始列表中的项目数,T是处理每个项目所需的总时间
您可以使用以下函数来封装此功能:
jQuery.eachWithDelay = function(sequence, delay, callback) {
var objects = jQuery.makeArray(sequence);
if (objects.length == 0) {
return;
}
var f;
f = function() {
var item = objects.shift();
if (callback(item) && objects.length != 0) {
setTimeout(f, delay);
}
};
setTimeout(f, delay);
};
被称为:
$.eachWithDelay($('.someClass'), 5000, function(item) {
// Do something with item
return true; // Return true to continue iterating, or false to stop.
});
请看。因为我们只是在四处寻找答案;这是我的。每个都没有
函数doTheDo(els){
}
doTheDo($('#errors li').toArray()
如果你给我们一些你正在做的事情的背景,这将更容易回答,因为解决方案将根据具体情况而有所不同。这是一种非常糟糕的做法。它会锁定浏览器(UI完全没有响应)并在整个时间内使CPU最大化。一些浏览器甚至可能会报告网页已挂起,以保护查看者免受错误的javascript代码的影响。javascript中的一个注释-Array.shift()
可能比手动遍历数组慢得多。这是因为javascript数组不是“真”数组——它们是以字符串作为键的对象。这意味着当您关闭第一个元素时,JS引擎必须移动数组中的每个项目,例如arr[“0”]=arr[“1”];arr[“1”]=arr[“2”]。。。等等。
@digitalbath:注意。当然,过早优化是万恶之源;如果在这种情况下需要这种优化,那么它可以非常容易地实现。我倾向于首先考虑可读性,这就是为什么我选择了shift
。但是读者应该了解性能影响,所以+1对您来说是完全同意的-我想我会提到它。如果我理解jQuery.delay函数,它会将内容放入队列中,并且只适用于使用该队列的特定类型的操作。由于OP没有说明他们在循环中真正想做什么,我们不知道这是否真的有效。你可以通过将.shift()替换为.pop()来倒退该死的,我无法回复@digitalbath,所以我在这里就这么做。你错了,至少在Chrome中,pop比for()快16倍,几乎比each()快66倍:证明:
var objects = $.makeArray($( '.someClass' ));
var callback;
callback = function() {
var item = objects.shift();
// Do something with item.
if (objects.length != 0) {
setTimeout(callback, 5000);
}
}
setTimeout(callback, 5000);
jQuery.eachWithDelay = function(sequence, delay, callback) {
var objects = jQuery.makeArray(sequence);
if (objects.length == 0) {
return;
}
var f;
f = function() {
var item = objects.shift();
if (callback(item) && objects.length != 0) {
setTimeout(f, delay);
}
};
setTimeout(f, delay);
};
$.eachWithDelay($('.someClass'), 5000, function(item) {
// Do something with item
return true; // Return true to continue iterating, or false to stop.
});
if(els.length == 0) return;
$(els.shift()).click();
setTimeout(doTheDo, 5000, els);