js定时器实例
/**
* 定时器
* @param {string} id 定时器标识,可通过他来直接调用定时器
* @param {number} delay 定时器延迟时间,单位ms
* @param {Function} fn 回调
* @return {object} timer实例
*/
window.timer = function(){
var cache = {};
var expando = \"timer-\"+ (+new Date);
var count = 0;
return function(id,delay,fn){
if(cache[id]){
return cache[id]
}
return new _class(id,delay,fn);
}
function _class(id,delay,fn){
var self = this;
self.id = id || expando + (count++);
self._time = null;
self.delay = delay || 1000;
self._list = [];
self._load = false;
var init = function () {
if(fn){
self.add(fn)
}
return (cache[id]=self);
}
/**
* 内部运行方法,运行完后会清除定时器
*/
var run = function(){
for(var i=0,len=self._list.length;i<len;i++){
if(self._list[i]()===false){
break;
}
}
return self.clear();
}
/**
* 添加回调,添加的方法将由先到后执行
* @param {Function} fn 回调方法,如果返回false将在执行的时候退出所有队列,并清空这个定时器
*/
self.add = function(fn){
if(\"function\"!==typeof(fn)){
return self;
}
self._list.push(fn);
if(!self._load&&self._list.length){
self._load = true;
self._time = setTimeout(function(){
run();
},self.delay);
}
return self;
}
/**
* 清空当前定时器
* @return {object} timer实例
*/
self.clear= function(){
self._list = [];
self._load = false;
clearTimeout(self._time);
self._time = null;
delete cache[self.id];
return self;
}
/**
* 触发所有的,当然回调里返回false会终止
* @return {object} timer实例
*/
self.trigger = function(){
return run();
}
return init();
}
}();
var a = timer(\"test\",1000*60);//初始化一个定时器,并设置为1分钟后执行
a.add(function(){//添加回调队列
alert(\"本来我能弹出的,但被下面的小伙伴clear了/ll\");
}).add(function(){
});
a.clear();//清除所有队列
timer(\"test\").add(\"我这个不管用啊\")//如果不是方法则不
.add(function(){//可以直接拿id使用这个实例
alert(\"哈哈,我要把后面的全干掉!\");
return false;//返回false则退出循环并清空队列
}).add(function(){
alert(\"我这个哈哈被阻止了\");
});
本文链接:https://xuexb.com/post/183.html
-- EOF --
发表于 2014年02月10日 16:21:44 ,添加在分类 前端技术 下 ,最后修改于 2016年07月16日 16:21:44
提醒: 本文最后更新于 3465 天前,文中所描述的信息可能已发生改变,请谨慎使用。
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。