一个JS定时器类
学习js,因为函数和定时器直接的关系是非绑定的。我不能说我开启一个定时,然后拿一个变量去记录这个setInterval的返回值,这样很麻烦。
本着面向对象的思想,利用业余时间(周末在家里)写了一个类,用来管理定时器。
吐槽下jQuery,不知道是不是我的jQuery版本太低,貌似jQuery没有提供很好的定时器管理类。
好废话不多说,上代码:
function TimeControlEx() {
var nCount = 0;
var oTimerIDs = []; //ID,Name
var that = this;
var nTimerId = 0;
this.ExecOnce = function (funcid) {
if (oTimerIDs[funcid].Limit == 0) {
//只要归零了,肯定是定时的,对于这种,就得关闭
clearInterval(oTimerIDs[funcid].TimerID);
}
};
this.add = function (nSec, oFunction, sName, nTimes) {
///<param name="nSec">延迟时间,毫秒</param>
///<param name="oFunction">调用函数</param>
///<param name="sName">定时器名称(可选)</param>
///<param name="nTimes">循环次数(可选)</param>
//todo:根据各个参数来创建,基础的参数是nSec和oFunction
var nParams = arguments.length;
var obj;
switch (nParams) {
case 2:
//两个参数,自动增加
nTimerId = setInterval(oFunction, nSec);
obj = {
ID: nCount,
TimerID:nTimerId,
Name: String(nCount),
Interval: nSec,
Limit: -1
};
oTimerIDs.push(obj);
break;
case 3:
//三个参数
nTimerId = setInterval(oFunction, nSec);
obj = {
ID: nCount,
TimerID: nTimerId,
Name: sName,
Interval: nSec,
Limit: -1
};
oTimerIDs.push(obj);
break;
case 4:
//四个参数
obj = {
ID: nCount,
TimerID: nTimerId,
Name: sName,
Interval: nSec,
Limit: nTimes
};
oTimerIDs.push(obj);
break;
default:
return;
}
};
this.CloseTimer = function (sTimerName) {
///<param name="sTimerName">计时器的名字,或ID</param>
if (typeof (sTimerName) == "number") {
//按照数字方法关闭
for (var j = 0; j < oTimerIDs.length; j++) {
if (oTimerIDs[j].ID == sTimerName) {
clearInterval(oTimerIDs[j].TimerID);
oTimerIDs = oTimerIDs.splice(j, 1);
nCount--;
break;
}
}
} else {
//按照字符串方式关闭
for (var m = 0; m < oTimerIDs.length; m++) {
if (oTimerIDs[m].Name == sTimerName) {
clearInterval(oTimerIDs[m].TimerID);
oTimerIDs.splice(m, 1);
nCount--;
break;
}
}
}
};
}
编辑:今天查看后,发现代码存在严重的bug,修复了一下,现在放出修改后的代码:
function TimeControlEx() {
var nCount = 0;
var oTimerIDs = []; //ID,Name
var that = this;
var nTimerId = 0;
this.ExecOnce = function (funcid) {
if (oTimerIDs[funcid].Limit == 0) {
//只要归零了,肯定是定时的,对于这种,就得关闭
clearInterval(oTimerIDs[funcid].TimerID);
}
};
this.add = function (nSec, oFunction, sName, nTimes) {
///<param name="nSec">延迟时间,毫秒</param>
///<param name="oFunction">调用函数</param>
///<param name="sName">定时器名称(可选)</param>
///<param name="nTimes">循环次数(可选)</param>
//todo:根据各个参数来创建,基础的参数是nSec和oFunction
var nParams = arguments.length;
var obj;
switch (nParams) {
case 2:
//两个参数,自动增加
nTimerId = setInterval(oFunction, nSec);
obj = {
ID: nCount,
TimerID: nTimerId,
Name: String(nCount),
Interval: nSec,
Limit: -1
};
oTimerIDs.push(obj);
break;
case 3:
//三个参数
nTimerId = setInterval(oFunction, nSec);
obj = {
ID: nCount,
TimerID: nTimerId,
Name: sName,
Interval: nSec,
Limit: -1
};
oTimerIDs.push(obj);
break;
case 4:
//四个参数
obj = {
ID: nCount,
TimerID: 0,
Name: sName,
Interval: nSec,
Limit: nTimes
};
var oFunc = function (oThis, oMyFunc) {
var oThat = oThis;
var oMyFun = oMyFunc;
var oRun = function () {
if (oThat.Limit > 0 || oThat.Limit == -1) {
oMyFun(); //执行传入的函数
if (oThat.Limit > 0) oThat.Limit--;
} else {
//自行了断
clearInterval(oThat.TimerID);
}
};
return oRun;
};
nTimerId = setInterval(oFunc(obj, oFunction), nSec);
obj.TimerID = nTimerId;
oTimerIDs.push(obj);
break;
default:
return;
}
};
this.CloseTimer = function (sTimerName) {
///<param name="sTimerName">计时器的名字,或ID</param>
if (typeof (sTimerName) == "number") {
//按照数字方法关闭
for (var j = 0; j < oTimerIDs.length; j++) {
if (oTimerIDs[j].ID == sTimerName) {
clearInterval(oTimerIDs[j].TimerID);
oTimerIDs = oTimerIDs.splice(j, 1);
nCount--;
break;
}
}
} else {
//按照字符串方式关闭
for (var m = 0; m < oTimerIDs.length; m++) {
if (oTimerIDs[m].Name == sTimerName) {
clearInterval(oTimerIDs[m].TimerID);
oTimerIDs.splice(m, 1);
nCount--;
break;
}
}
}
};
}
谢谢大家的支持
一个JS定时器类的更多相关文章
- 一个js验证类
//******************************************************************* //作者: 丁伯洋 //日期: 2006-4-27 //概要 ...
- 我的第一个JS组件-跨浏览器JS调试工具
武汉九天鸟-p2p网贷系统开发-互联网应用软件开发 公司官网:http://jiutianniao.com 社交问答:http://ask.jiutianniao.com 最近,在看公司一个JS大牛 ...
- 一个重构的js分页类
// JavaScript Document /**//** * js分页类 * @param iAbsolute 每页显示记录数 * @param sTableId 分页表格属性ID值,为Strin ...
- js定时器的使用(实例讲解)
在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...
- 怎么使用jquery判断一个元素是否含有一个指定的类(class)
在jQuery中可以使用2种方法来判断一个元素是否包含一个确定的类(class).两种方法有着相同的功能.2种方法如下:(个人喜欢用hasClass()) 1. hasClass( ...
- 移动Web与js定时器暂停或不准确计时的问题解决
PC 上的 Firefox.Chrome 和 Safari 等浏览器,都会自动把未激活页面中的 JavaScript 定时器(setTimeout.setInterval)间隔最小值改为 1 秒以上: ...
- js定时器、高亮修改单元格背景色
window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) 解释:code:在定时时间到时要执行的J ...
- js定时器 特定时间执行某段程序的例子
定时器想必大家并不陌生吧,在本文为大家详细介绍下js中是如何实现定时器的,具体原理及代码如下. 例子: $(function(){ var handler = function(){ //www.jb ...
- JS创建类和对象
JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...
随机推荐
- [shiro] Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
访问某页面时,出现了这个异常: java.lang.IllegalArgumentException: Wildcard string cannot be null or empty. Make su ...
- 每日学习心得:未定义的命名空间前缀"xsd"问题和<%%>、<%=%>、<%$%>、<%@%>的区别
2013-6-29 1. 未定义的命名空间前缀“xsd” 上周在项目开发中遇到这样的一个问题,在一个页面用到了自定义的Picker控件,在IE6.7.8.9以及IE10兼容模式下都没有任何问题,但是一 ...
- VS2010打开项目时,出现“已经在解决方案中打开了具有该名称的项目”问题的解决方案
用的是VSS代码管理.一打开解决方案就看到有个类库不能加载. 解决方法: 直接右键编辑无法加载的类库,或者记事本编辑有问题类库的csproj文件, 删除以下几行: <SccProjectName ...
- Python基础教程【读书笔记】 - 2016/6/26
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第一波:第6章 抽象 [总览] 介绍函数.参数parameter.作用于scope概念,以及递归概念. [6.1] 函 ...
- (转)Lambda表达式详解
本文转载自:http://www.cnblogs.com/knowledgesea/p/3163725.html 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸 ...
- 记一下一些比较有意思的第三方API
野狗,第三方后端通信用的:https://www.wilddog.com/ 花瓣网,用来做设计的:http://huaban.com/ Ping++,聚合支付接口:https://www.pingxx ...
- CSS媒体查询(@media)
@media only screen and (max-width: 500px) { .gridmenu { width:100%; } .gridmain { width:100%; } .gri ...
- linux时间管理
/etc/sysconfig/clock 该配置文件可用来设置用户选择何种方式显示时间.如果硬件时钟为本地时间,则UTC设为0,并且不用设置环境变量TZ.如果硬件时钟为UTC时间,则要 ...
- bzoj2289: 【POJ Challenge】圆,圆,圆
Description 1tthinking随便地画了一些圆. ftiasch认为这些圆有交集(面积非零)的可能性不大.因为他实在画了太多圆,所以你被请来判断是否存在交集. Input 第1行,一个整 ...
- HDMI的CEC是如何控制外围互联设备的
1. HDMI CEC算是一个相当庞大的系统,想了解还要从HDMI接口信号啊.物理地址啊.逻辑地址啊等等HDMI基础的东西说起. 2. 不过可以简单的这么理解,在HDMI CEC最小系统里,所有通过H ...