+ -
当前位置:首页 → 问答吧 → jquery有没有延时函数?

jquery有没有延时函数?

时间:2009-05-14

来源:互联网

我做一个slideUp和slideDown,每一次都要在执行完后判断元素是否全部可见还是全部hidden,但是问题出来了,
jquery在判断的时候我的slideUp事件还在进行中(除非把速度设在75毫秒以下),所以无论怎么判断,都不可能出现所有元素都hidden的情况,因为最后一个应该是hidden的元素还在visible的状态中,
slideDown当然没问题,只要slideDown了一点点就是visible了,所以这个slideUp的问题很棘手,我上网查延时的方法,可是却一无所获。

究竟jQuery有没有不要插件就能实现延时的方法呢?比如上例,我只要它延时300毫秒左右再执行检查函数,就没问题了。

我试过在检查前执行一次for循环,可是把数值设小没效果,数值一设大,反而使得滑动的效果变卡,可见滑动与for循环同时在走,这个方法不可行。我在jquery的API参考文档里面也没找到跟延时相关的说明,那么有没有计时的方法呢?比如计算时间差,然后再执行,不过这种思路也是延时函数的方法了吧?

所以我的问题是,jQuery有没有现成的延时方法,或是变相地利用时间来计算时间差的方法,各位高手支招啊,谢谢

作者: walkerwalker   发布时间: 2009-05-14

slideUp和slideDown都有第2个参数callback

你在里面对一个公共变量加1,然后判断是否达到总数,就知道是否全部完成了

此外,jQuery没有延时,window对象有个settimeout函数

作者: keakon   发布时间: 2009-05-14

引用
引用第1楼keakon于2009-05-14 09:10发表的  :
slideUp和slideDown都有第2个参数callback

你在里面对一个公共变量加1,然后判断是否达到总数,就知道是否全部完成了


多谢,但是问题是:
1,我有用过第2个callback,甚至把检查函数写到过点击事件外面,都无效,因为我最终发现,只要slideUp或slideDown一开始进行,jQuery就理解成已经执行完成了,会接下来执行下一个函数,或callback,屡试不爽,根本不会等动画完成之后才执行callback,所以这招无效。

2,对公共变量加1,判断是否达到总数,在哪里进行?能给个示例吗?jQuery不是已经把slide给封装起来了吗?

作者: walkerwalker   发布时间: 2009-05-14

我用起来完全没问题啊,动画完成后才会callback

复制代码
  1. <script type="text/javascript">
  2. var num = 0;
  3. var total = 2;
  4. function check() {
  5.   ++num;
  6.   if (num == total) {
  7.     num = 0;
  8.     alert('done');
  9.   }
  10. }
  11. function up() {
  12.   $('div').slideUp(
  13.     1000,
  14.     check
  15.   );
  16. }
  17. function down() {
  18.   $('div').slideDown(
  19.     1000,
  20.     check
  21.   );
  22. }
  23. </script>
  24. </head>
  25. <body>
  26. <div>1234</div>
  27. <div>5678</div>
  28. <input type="button" value="up" onclick="up();" />
  29. <input type="button" value="down" onclick="down();" />
  30. </body>

作者: keakon   发布时间: 2009-05-14

keakon你好,谢谢你的热心答复,现在问题如下,
1,一开始我没看懂你的check函数,原因是我不知道为什么要num==total,后来我把它改成check(){alert("test");}
才发现这个test弹出两次,能给我解释一下为什么会弹出两次么?我自己写的验证只弹出一次呀。而且我直接把alert函数写在callback里面,它是先于动画弹出,而且只弹出一次,必须点确定后动画才执行,这违背了callback的本意了吧?不明白,这两个问题不知道您碰到过或知道其实是怎么回事不。

2,在您给的例子里,因为我做的验证是元素是否可见,所以把check函数改成如下:
function check() {
    if($("div").is(":visible"))
    {
       alert("visible");
    }
    else
    {
      alert("hidden");
     }
}
您按up按钮试一下,会发现第一次弹出visible,第二次弹出hidden。所以这次两个问题一起出现了,为什么弹两次,为什么两次结果不一样。
而且不管原因为何,既然第一次弹出visible了,说明check函数执行的时候那个slideUp的动画还没完成,对吧?

作者: walkerwalker   发布时间: 2009-05-15

当然,后来我的实验证明$("div").is(":visible")并不能达到我所期望的验证所有选择出来的div是否可见的效果,(真要达到效果要each每个div,验证可见性),但是显然这个错误并不能解释为什么callback执行的时候其实动画还没完。

作者: walkerwalker   发布时间: 2009-05-15

分享我的实验过程吧,原来所谓的“弹出两次”,不过是有几个div的原因罢了,我重做一个例子,写了四个div,然后用slideUp把它缩上去,然后callback一个check,结果果然弹出4次alert,但是,前三个都是visible,最后一个才是hidden,
继续尝试,把html()弹出来,才发现原来用if($("div"))这个方法它不是一个一个地去判断,而是每次判断的第一个,我的方法有严重问题,呵呵,问题原因找到了。

我试着在check里面弹出$(this)而不是$("div)的visible状态,很正常地出现了所有的都为hidden的情况。问题解决,
唯一没弄明白的就是,就算我用$("div")它永远判断第一个找到的div是否可见,那它总应该是第一个被缩上去的吧?为什么直到最后一次才显示hidden呢?

作者: walkerwalker   发布时间: 2009-05-15

我直接在callback里写也是在动画执行完才弹出,没遇到你说的情况。

num == total是因为每个符合的元素都会执行callback,所以我每次执行都对num加1(注意num必须是公共变量),直到等于总数才知道是最后一个执行的。
当然,total你可以用$('div').length代替,而不用像我这样写成2。

你在callback里不应该用if($("div").is(":visible")),而应该是if($(this).is(":visible")),原因是后者只会检查当前jQuery对象,而前者会每次都检查$("div")这个对象。

作者: keakon   发布时间: 2009-05-15

是哈,问题出在我的验证方法上,上面已经得出结论了。

不过你说直接在slideUp(speed,callback)上写callback还是在动画完成后执行,我这里怎么测试也是动画执行前执行的
代码如下slideUp(1000,alert("test")),您可以试一下,先弹出test对话框,点击确定后才执行动画

作者: walkerwalker   发布时间: 2009-05-15

slideUp(1000,alert("test"))

你传的不是函数对象,而是函数执行结果…

slideUp(1000, function(){alert("test");});

jQuery里经常需要用到匿名函数

作者: keakon   发布时间: 2009-05-15

基本功不扎实啊。。。原来是这么回事
其实还是不大懂,但是问题出现的地方已经找到了也半明白了。
只是我不明白,匿名函数和函数结果对于这个slideUp的第二个参数有什么影响,假如它需要我传入第二个参数是一个函数对象,而我却传入了一个方法(应该叫方法吧?),那应该是报错才对,而不是先把方法执行了吧?还是jQuery特意针对这种情况写了处理逻辑?

作者: walkerwalker   发布时间: 2009-05-18

相关阅读 更多