最近一直在重复发明轮子,又碰到了一个需要用到类似sleep函数的函数,可javascript中并没有提供函数暂停执行Nms的方法,只能自己利用setInterval实现一个类似的功能。
js 代码
- delay = function(fn,parm,scope,config){
- var start = new Date();
- var zero_interval = null;
- var config = config || [];
- var h = function(){
- if(new Date()-start >=parm){
- clearInterval(zero_interval);
- fn.apply(scope,config);
- }
- }
- zero_interval = setInterval(h,parm);
- }
参数说明如下,fn是延时之后待执行的函数,parm是延时的时间(最后的延时时间会在此基础上增加10-15ms),scope是fn函数的作用范围,config是fn函数的参数。
用法如下:
js 代码
- var startT;
- function delayShow(){
- startT = new Date();
- delay(show,20);
- }
- function show(){
- alert(new Date() - startT);
- }
这里得到的提示是31ms的样子,不过在我自己的代码中只是需要延时一下,而不需要严格控制时间的长短。所以这个时间也就没必要细究了。
我自己程序中的代码如下:
js 代码
- ZERO.delay = function(fn,parm,scope,config){
- var start = new Date();
- var zero_interval = null;
- var config = config || [];
- var scope = scope || window;
- var h = function(){
- if(new Date()-start >=parm){
- clearInterval(zero_interval);
- fn.apply(scope,config);
- }
- }
- zero_interval = setInterval(h,parm);
- }
- ZMenu.prototype.onMouseOver = function(){
- this.addClass("mouseoverstyle");
- this.hiddenMenu = false;
- if(this.hasChild){
- this.click();
- }
- }
- ZMenu.prototype.onMouseOut = function(){
- //此处需要延时一段时间再执行
- if(this.hasChild){
- ZERO.delay(this.hideChildMenu,20,this);
- this.hiddenMenu = true;
- }
- else{
- this.hiddenMenu = true;
- this.hideChildMenu();
- }
- }