02月10, 2014

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 启用代理。

AltStyle によって変換されたページ (->オリジナル) /