论坛首页 Web前端技术论坛

javascript中的函数(方法)延时执行的实现

浏览 8501 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-01  

最近一直在重复发明轮子,又碰到了一个需要用到类似sleep函数的函数,可javascript中并没有提供函数暂停执行Nms的方法,只能自己利用setInterval实现一个类似的功能。

js 代码
  1. delay = function(fn,parm,scope,config){   
  2.     var start = new Date();   
  3.     var zero_interval = null;   
  4.     var config = config || [];   
  5.        
  6.     var h = function(){   
  7.         if(new Date()-start >=parm){   
  8.             clearInterval(zero_interval);   
  9.             fn.apply(scope,config);   
  10.         }   
  11.     }   
  12.   
  13.     zero_interval = setInterval(h,parm);   
  14. }  

参数说明如下,fn是延时之后待执行的函数,parm是延时的时间(最后的延时时间会在此基础上增加10-15ms),scope是fn函数的作用范围,config是fn函数的参数。

用法如下:

js 代码
  1. var startT;   
  2. function delayShow(){   
  3.     startT = new Date();   
  4.     delay(show,20);   
  5. }   
  6.   
  7. function show(){   
  8.     alert(new Date() - startT);   
  9. }  

这里得到的提示是31ms的样子,不过在我自己的代码中只是需要延时一下,而不需要严格控制时间的长短。所以这个时间也就没必要细究了。

我自己程序中的代码如下:

js 代码
  1. ZERO.delay = function(fn,parm,scope,config){   
  2.     var start = new Date();   
  3.     var zero_interval = null;   
  4.     var config = config || [];   
  5.     var scope = scope || window;   
  6.        
  7.     var h = function(){   
  8.         if(new Date()-start >=parm){   
  9.             clearInterval(zero_interval);   
  10.             fn.apply(scope,config);   
  11.         }   
  12.     }   
  13.   
  14.     zero_interval = setInterval(h,parm);   
  15. }   
  16.   
  17.   
  18. ZMenu.prototype.onMouseOver = function(){   
  19.     this.addClass("mouseoverstyle");   
  20.     this.hiddenMenu = false;   
  21.     if(this.hasChild){   
  22.         this.click();   
  23.     }   
  24. }   
  25.   
  26. ZMenu.prototype.onMouseOut = function(){   
  27.     //此处需要延时一段时间再执行   
  28.     if(this.hasChild){   
  29.         ZERO.delay(this.hideChildMenu,20,this);   
  30.         this.hiddenMenu = true;   
  31.     }   
  32.     else{   
  33.         this.hiddenMenu = true;   
  34.         this.hideChildMenu();   
  35.     }   
  36. }   
   发表时间:2007-12-01  
既然是执行一次,为什么不用setTimeout呢
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics