JavaScript实现绑定DOM的定时器插件
问题
使用原生的setTimeout和setInterval仅仅能够实现, 定时执行事件处理函数,
在网页开发中, 往往会出现一种情况,定时器用于定时更新某个页面区域的数据,
往往在页面加载之后, 就启动这个定时器, 往后则间隔执行此定时器。
页面上定时刷新的区域可能会动态消失, 特别是在ajax被广泛使用的今天,
如果定时刷新的区域被删除了, 则定时器材也需要自动清除掉。
此二个接口,如果实现这种效果需要, 自己维护定时器句柄, 并且在处理定时器事件函数的时候,
首先判断 指定的刷新区域是否还是存在的? 如果还存在, 则继续执行数据刷新的逻辑,
如果不存在, 则删除定时器,不执行数据刷新的动作。
方案
此类定时器需要与 目标DOM进行绑定, 在事件处理函数中, 判断如果DOM被删除, 则清理定时器。
Code
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>My First WebComponent</title>
</head>
<body>
<input type="text" id="test" name="test" value="test"></input>
<input type="button" id="removetest" name="removetest" value="removetest"></input>
<script type="text/javascript">
/************************ timer定时器插件 start **********************/
(function () {
/* 此函数让 定时器处理handler,
可以获取到 调用 setTimeout_context_binding 的对象 */
var setTimeout_context_binding = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
return window.setTimeout(vCallback instanceof Function ? function () {
vCallback.apply(oThis, aArgs);
} : vCallback, nDelay);
};/* 此函数让 定时器处理handler,
可以获取到 调用 setTimeout_context_binding 的对象 */
var setInterval_context_binding = function(vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */ ) {
var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
return window.setInterval(vCallback instanceof Function ? function() {
vCallback.apply(oThis, aArgs);
} : vCallback, nDelay);
};/* 定义定时器的构造函数 */
var timer = function(fnAlarm, options)
{
/* external settable */
this.fnAlarm_inner = function(){
$("#timer_msg").printMsg(this.timerHandle.toString()
+ "-please add custom fnAlarm")
};this.timeout = undefined;
this.interval = undefined;
this.contextDom = undefined;/* inner maintain variable */
this.timerHandle;/* set external variable */
if ( fnAlarm )
{
this.fnAlarm_inner = fnAlarm;
}if ( options )
{
if ( options.timeout )
{
this.timeout = options.timeout;
}if ( options.interval )
{
this.interval = options.interval;
}if ( options.contextDom )
{
this.contextDom = options.contextDom;
}
}
}/* 定义定时器的原型方法 */
timer.prototype.start = function(){
var context_binding_timer = undefined;
var time_value = undefined;if ( this.timeout ) {
context_binding_timer = setTimeout_context_binding;
time_value = this.timeout;
} else {
context_binding_timer = setInterval_context_binding;
time_value = this.interval;
}this.timerHandle = context_binding_timer.call(this, function(){
/* 上下文DOM绑定的目的在这里:
如果此定时器绑定的DOM已经从文档中删除,则不调用定时处理handler */
if ( this.contextDom && !document.body.contains(this.contextDom) )
{
this.stop();
return;
}this.fnAlarm_inner.call(this);
delete this.timerHandle;
}, time_value);
};timer.prototype.stop = function(){
if ( this.timeout ) {
clearTimeout(this.timerHandle)
} else {
clearInterval(this.timerHandle)
}
delete this.timerHandle;
};timer.prototype.getTimerID = function(){
return this.timerHandle;
};/* 开放接口 */
window.ContextBindingTimer = timer;
})();
/************************ timer定时器插件 end **********************///bind remove button event
document.getElementById("removetest").onclick=function(){
var test = document.getElementById("test");
test.parentNode.removeChild(test);
}var targetDom = document.getElementById("test");
/* construct a interval timer with setTimeout timer */
var timer = new ContextBindingTimer(function(){
console.log("access once!")
}, {timeout:1000, contextDom:targetDom})
timer.start()
</script>
</body>
</html>
Implementation effect
页面上输入框删除之前, 定时器打印数目一直增加。

点击按钮删除输入框之后, 定时器打印数据则没有变化了, 证明定时器已经被删除。

JavaScript实现绑定DOM的定时器插件的更多相关文章
- JavaScript——BOM和DOM
什么是BOM bom:浏览器对象模型 什么是DOM dom:文档对象模型 BOM操作: 调用windows浏览器窗口 windows对象可以通过点调用子对象 windows.navigator对象,可 ...
- Javascript事件绑定的几种方式
Javascript的事件绑定主要有四种方法(一下在IE中运行正常,但不保证其他浏览器): [注:onXXX为某一事件,fun为某一function,domId为某一DOM对象id,event类型见后 ...
- javascript系列之DOM(三)---事件
原文:javascript系列之DOM(三)---事件 事件是javascript跳动的心脏,是DOM所有成分结合的万金油.当我们在WEB 上进行某些交互时,事件也就发生了.点击某些内容,鼠标经过特定 ...
- 第一百二十一节,JavaScript事件绑定及深入
JavaScript事件绑定及深入 学习要点: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型) ...
- Javascript事件模型(三):JavaScript事件绑定方法总结(及Jquery)
JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScript代码中直接绑定 3 绑定事件监听函数 JQuery中绑定事件的几种方法 主要有on().bind( ...
- JavaScript(1)---绑定事件、解除绑定事件
JavaScript(1)---绑定事件.解除绑定事件 一.事件概述 1.事件的几个概念 · 事件 指的是文档或者浏览器窗口中发生的一些特定交互瞬间.我们可以通过侦听器(或者处理程序)来预定事件,以便 ...
- 【JavaScript基础】Js的定时器(你想看的原理也在哟)
[JavaScript基础]Js的定时器(你想看的原理也在哟) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 本章是经历 ...
- JavaScript进阶内容——DOM详解
JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...
- 借助JavaScript中的Dom属性改变Html中Table边框的颜色
借助JavaScript中的Dom属性改变Html中Table边框的颜色 -------------------- <html> <head> <title>我是页 ...
随机推荐
- OpenResty+lua+GraphicsMagick生成缩略图
1.安装GraphicsMagick 下载地址:http://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.19/G ...
- SpringMVC视图机制详解[附带源码分析]
目录 前言 重要接口和类介绍 源码分析 编码自定义的ViewResolver 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门bl ...
- asp.net mvc本地程序集和GAC的程序集冲突解决方法
一个从asp.net mvc 3升级到asp.net mvc 4的项目发生了如下错误: [A]System.Web.WebPages.Razor.Configuration.HostSection c ...
- 修改linux运行级别
1.Linux下的7个运行级别 0 系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭. 1 单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登 ...
- java分享第五天(数组)
1 声明数组变量: double[] mylist; or double mylist[]; 2 创建数组: 可以通过使用new运算符使用以下语法创建一个数组: arrayRefVar=new ...
- (转)as3效率优化
1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了 ...
- iOS 程序员 6 级考试(答案和解释)
iOS 程序员 6 级考试(答案和解释) 我是前言 1. 下面的代码分别输出什么? @implementation Son : Father- (id)init { self = [super i ...
- C程序编译过程
1.1程序被其他程序翻译成不同的格式 1.hello.c #include <stdio.h> int main() { printf("hello world\n") ...
- [zt]OpenCV2.1.0的安装
下载和安装 OpenCV 2.1.0 2.添加库文件:打开VS 2008,选择菜单:Tools->options->Projects and Solutions >VC++ Dire ...
- css问题 ie7兼容性问题
1.响应式网站用百分比时ie7不兼容:试试将margin:0 10% 改为margin-left:15%; 左边是可以的,但是右边就不行了 2.ie7的span 里的字会出现白色背景 ,是因为没有定高 ...