Javascript 如何使用jQuery';s delay()作为sleep()?
jQuery可以用作sleep()或wait()函数吗?等待后挂起语句的执行。我尝试了$()。延迟(5000),但没有5秒的等待。delay()是否仅用于效果 我不是在寻找涉及另一个函数的setTimeout延迟执行或占用CPU的解决方案。我想要一个sleep()函数,它可以在不同的脚本中重用 添加: 我不是想建议一个根本不使用setTimeout的解决方案。我见过一些解决方案,它们要求将所有需要延迟的代码移到自己的函数中,以便setTimeout可以调用它。我不想那样。使用setTimeout的自包含包装函数或在虚拟非视觉效果中使用jQuery delay(),只是为了模拟睡眠函数。Javascript(扩展为jQuery)没有真正的“睡眠”函数。你可以或多或少地滥用setTimeout和setInterval(以及它们的衍生物,比如延迟)来模拟睡眠,但你通常最好只是适应setInterval/Timeout的做事方式。。。弄清楚你想要做什么,把它封在一个函数中,作为一个参数传递给这两个函数中的一个 编辑: 好的,我看到你的编辑了。你真的想要一个传统的睡眠功能。下面的内容绝对是一种滥用,完全不是我所推荐的。但如果我必须构建一个来拯救我的生命,我会这样做:测试大量循环需要多长时间,做统计上显著的测试,平均结果,并使用这些信息定义一个函数,将给定的毫秒数大致转换为循环数,然后它就通过了 在JavaScript中:Javascript 如何使用jQuery';s delay()作为sleep()?,javascript,jquery,Javascript,Jquery,jQuery可以用作sleep()或wait()函数吗?等待后挂起语句的执行。我尝试了$()。延迟(5000),但没有5秒的等待。delay()是否仅用于效果 我不是在寻找涉及另一个函数的setTimeout延迟执行或占用CPU的解决方案。我想要一个sleep()函数,它可以在不同的脚本中重用 添加: 我不是想建议一个根本不使用setTimeout的解决方案。我见过一些解决方案,它们要求将所有需要延迟的代码移到自己的函数中,以便setTimeout可以调用它。我不想那样。使用setTimeout
function timeloop(cycles) {
var start = new Date().getTime();
for(var j=0; j<cycles; j++);
var end = new Date().getTime();
return end-start;
}
var sleep = (function () {
var ms_tally = 0, i, s = 100, L = 10000;
for(i=0; i<s; i++)
ms_tally += timeloop(L);
var avg = ms_tally / i;
var ms_per_cycle = avg / L;
var cycles_per_ms = 1 / ms_per_cycle;
return eval('function (ms) { for(var k=0, z=ms*'+cycles_per_ms+'; k<z; k++); }');
})()
函数timeloop(循环){
var start=new Date().getTime();
对于(var j=0;j您将不走运。任何sleep()
函数都很可能需要使用setTimeout
(或者可能是setInterval
)。事实上,它本身使用setTimeout
。来源于jQuery 1.4.2:
delay: function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || "fx";
return this.queue( type, function() {
var elem = this;
setTimeout(function() {
jQuery.dequeue( elem, type );
}, time );
});
},
仅适用于特效使用的队列(即fx
队列)。可以使用自定义队列使用,如果不想占用CPU时间,则必须以某种方式使用设置超时
或类似工具。以下是一个示例:
function myfn() {
// make it so that `myvar` is in scope and can
// be shared by both `fn1` and `fn2`
var myvar
function fn1() {
alert('foo')
// set `bar` in the above `myfn`'s scope (without `var`)
myvar = 'bar'
// sleep for 1.2 seconds
setTimeout(fn2, 1200)
}
function fn2() {
alert(myvar)
}
fn1()
}
myfn()
这对我来说非常有效:
示例:
根据你的问题
如何将jQuery的delay()用作sleep()?并回答以下问题:
我尝试了$()。延迟(5000),但没有5秒的等待。是延迟()
只用于特效
您是否已经尝试过延迟为()的jQuery.queue()?
例如
$.fn.extend({
changeBgColor:函数(颜色){
返回此值。每个(函数(){
$(this.css(“背景色”,color);
});
}
});
$.fn.wait=函数(mls,回调){
返回此.delay(mls).queue(函数(){
$(“span”).text($(this.queue().length);
回调();
$(this.dequeue();
});
};
$(文档).ready(函数(){
$(“#开始”)。单击(函数(){
var div=$(“div”);
div.delay(1000).队列(函数(){
$(“span”).text(div.queue().length);
div.css(“背景色”、“红色”)。文本(“红色”);
$(this.dequeue();
}).延迟(1000).队列(函数(下一个){
$(“span”).text(div.queue().length);
div.changeBgColor(“绿色”)。文本(“绿色”);
next();
});
div.wait(1000,函数(){
div.changeBgColor(“黄色”)。文本(“黄色”);
}).wait(1000,函数(){
div.changeBgColor(“蓝色”)。文本(“蓝色”);
});
});
});
开始
我见过的最近的一个插件是Ben Alman的doTimeout
插件-但即使这样,以下链接方法的执行也不会因传递给doTimeout
方法调用的时间间隔而延迟。它不存在,克服它,使用setTimeout!好吧,作为练习,我添加了一个常规的睡眠
,但是。。。如果计时非常重要,就不要使用它。如果这阻止了浏览器后台进程的运行,它对我来说就不起作用。这取决于浏览器。我认为大多数浏览器都有各自的JavaScript上下文执行它自己的线程,这意味着理论上还有其他事情可以发生。不过,在实践中,我看到处理器咀嚼JS会锁住浏览器呃,我相信其他人也有。我认为像doTimeout这样的东西将是最接近实际的解决方案,让人感觉是循序渐进的。我使用了我找到的所有实现,但没有一个能正常工作。所以我使用setTimeout并拆分代码。
$.doTimeout(3000,function(){
alert('yahoooooo!');
});