一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

JavaScript Timer實現(xiàn)代碼

ok,不廢話了,實現(xiàn)一個Javascript的Timer吧
比起as3的Timer類,功能上略有改動
timer2.src.js
復(fù)制代碼 代碼如下:
/**
* Timer 模型
*
* @author rainsilence
* @version 2.0
*/
(function() {
/**
* TimerEvent constructor 構(gòu)造器
*
* @param type 事件類型
* @param bubbles 是否毛票
* @param cancelable 是否可取消
*/
TimerEvent = function(type, bubbles, cancelable) {
this.type = type;
this.bubbles = bubbles;
this.cancelable = cancelable;
};
/**
* Event 時間事件聲明
*
* @event TIMER
* @event TIMER_COMPLETE
*/
extend(TimerEvent, {
TIMER : "timer",
TIMER_COMPLETE : "timerComplete"
});
/**
* Event 方法
*
* @method toString
*/
extend(TimerEvent.prototype, {
toString : function() {
return "[TimerEvent type=" + this.type +
" bubbles=" + this.bubbles +
" cancelable=" + this.cancelable +"]";
}
});
/**
* Extend 擴(kuò)展類,對象的屬性或者方法
*
* @param target 目標(biāo)對象
* @param methods 這里改成param也許更合適,表示承載著對象,方法的對象,用于target的擴(kuò)展
*/
function extend(target, methods) {
if (!target) {
target = {};
}
for (var prop in methods) {
target[prop] = methods[prop];
}
return target;
}
/**
* Timer 構(gòu)造器
*
* @param delay 延時多少時間執(zhí)行方法句柄
* @param repeatCount 重復(fù)多少次,如果不設(shè)置,代表重復(fù)無限次
*/
Timer = function(delay, repeatCount) {
var listenerMap = {};
listenerMap[TimerEvent.TIMER] = [];
listenerMap[TimerEvent.TIMER_COMPLETE] = [];
extend(this, {
currentCount : 0,
running : false,
delay : delay,
repeatCount : repeatCount,
// true:Interval,false:Timeout
repeatType : repeatCount == null || repeatCount < 1 ? true : false,
handler : listenerMap,
timerId : 0,
isCompleted : false
});
};
// 事件對象初始化(這部分未實現(xiàn))
var timerEvent = new TimerEvent(TimerEvent.TIMER, false, false);
var timerCompleteEvent = new TimerEvent(TimerEvent.TIMER_COMPLETE, false, false);
/**
* Timer 計時器方法
*
* @method addEventListener 增加一個方法句柄(前兩個參數(shù)必須,后一個參數(shù)可選)
* @method removeEventListener 移除一個方法句柄
* @method start 開始計時器
* @method stop 結(jié)束計時器
* @method reset 重置計時器
*/
extend(Timer.prototype, {
addEventListener : function(type, listener, useCapture) {
if (type == TimerEvent.TIMER || type == TimerEvent.TIMER_COMPLETE) {
if (!listener) {
alert("Listener is null");
}
if (useCapture == true) {
this.handler[type].splice(0, 0, [listener]);
} else {
this.handler[type].push(listener);
}
}
},
removeEventListener : function(type, listener) {
if (type == TimerEvent.TIMER || type == TimerEvent.TIMER_COMPLETE) {
if (!listener) {
this.handler[type] = [];
} else {
var listeners = this.handler[type];
for (var index = 0; index < listeners.length; index++) {
if (listeners[index] == listener) {
listeners.splice(index, 1);
break;
}
}
}
}
},
start : function() {
var timerThis = this;
if (this.running == true || this.isCompleted) {
return;
}
if (this.handler[TimerEvent.TIMER].length == 0 &&
this.handler[TimerEvent.TIMER_COMPLETE].length == 0) {
alert("No Function");
return;
}
if (this.repeatType) {
this.timerId = setInterval(function() {
dispachListener(timerThis.handler[TimerEvent.TIMER], timerEvent);
timerThis.currentCount++;
}, this.delay);
} else {
this.timerId = setTimeout(function() {delayExecute(timerThis.handler[TimerEvent.TIMER]);}, this.delay);
}
this.running = true;
function delayExecute(listeners) {
dispachListener(listeners, timerEvent);
timerThis.currentCount++;
if (timerThis.currentCount < timerThis.repeatCount) {
if (timerThis.running) {
timerThis.timerId = setTimeout(function() {delayExecute(listeners);}, timerThis.delay);
}
} else {
timerThis.running = false;
}
if (timerThis.running == false) {
if (!timerThis.isCompleted) {
dispachListener(timerThis.handler[TimerEvent.TIMER_COMPLETE], timerCompleteEvent);
}
timerThis.isCompleted = true;
}
}
function dispachListener(listeners, event) {
for (var prop in listeners) {
listeners[prop](event);
}
}
},
stop : function() {
this.running = false;
if (this.timerId == null) {
return;
}
if (this.repeatType) {
clearInterval(this.timerId);
} else {
clearTimeout(this.timerId);
}
if (!this.isCompleted) {
var listeners = this.handler[TimerEvent.TIMER_COMPLETE];
for (var prop in listeners) {
listeners[prop](timerCompleteEvent);
}
}
this.isCompleted = true;
},
reset : function() {
this.currentCount = 0;
this.isCompleted = false;
}
});
})();

接下來測試吧,大家見過新浪網(wǎng)上的滾動顯示嗎?用setTimeout寫的,真叫牛叉。。。。。。換成Timer重構(gòu),簡單易懂
timerTest.html
復(fù)制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Insert title here</title>
<style type="text/css">
.rowLine {
width: 400px;
height: 80px;
border-bottom-style: solid;
border-width: 1px;
}
.barList {
border-style: solid;
border-width: 1px;
width:400px;
height: 80px;
overflow: hidden;
}
</style>
<script type="text/Javascript" src="js/timer2.src.js"></script>
<script type="text/Javascript">
<!--
var timer = new Timer(50);
var globalTimer = new Timer(10000);
var bList;
function init() {
bList = document.getElementById("barList");
timer.addEventListener(TimerEvent.TIMER, calTime);
timer.start();
globalTimer.addEventListener(TimerEvent.TIMER, controlTime);
globalTimer.start();
}
function controlTime() {
if (!timer.running) {
timer.reset();
timer.start();
}
}
function calTime() {
bList.scrollTop += 1;
if (bList.scrollTop > 80) {
timer.stop();
var barNode = bList.firstChild;
if (barNode.nodeType == 3) {
bList.appendChild(barNode);
bList.appendChild(bList.getElementsByTagName("div")[0]);
} else {
bList.appendChild(barNode);
}
bList.scrollTop = 0;
}
}
window.onload = init;
// -->
</script>
</head>
<body>
<div class="barList" id="barList">
<div class="rowLine" style="background-color: red" style="background-color: red">1</div>
<div class="rowLine" style="background-color: pink" style="background-color: pink">2</div>
<div class="rowLine" style="background-color: blue" style="background-color: blue">3</div>
<div class="rowLine" style="background-color: gray" style="background-color: gray">4</div>
</div>
</body>
</html>

addEventListener的useCapture參數(shù)本為捕獲階段觸發(fā)之意,現(xiàn)在改成如果true,則在其他句柄之前觸發(fā),如果false,則在其他句柄之后觸發(fā)。
后記:
現(xiàn)在貌似大家比較流行評論說明書的用法。。。比如struts+spring+hibernate。而忽略了編程的實質(zhì)。希望大家多看源碼,多討論源碼,那樣才會有所謂的思想。否則人家今天用這個framework,明天換了。你又要從頭開始了。

JavaScript技術(shù)JavaScript Timer實現(xiàn)代碼,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲伊人成人网 | 日本韩国视频 | 激情婷婷成人亚洲综合 | 欧美精品成人久久网站 | 草草免费 | 国产小视频国产精品 | 亚洲精品欧美综合四区 | 最新99国产成人精品视频免费 | 久久伊人精品一区二区三区 | 国产黄色小视频 | 久久大香香蕉国产免费网站 | 激情小说激情图片 | 一级毛片免费不卡 | jizz大全日本护士喷奶水 | 精品国产美女福利在线 | 日本精品视频一区二区 | 日本一本在线视频 | 国产小视频福利 | 国产亚洲精品俞拍视频 | 二区在线视频 | 欧美特黄特刺激a一级淫片 欧美特黄特色aaa大片免费看 | 91福利在线视频 | 国产a级精品特黄毛片 | 午夜精品视频在线 | 亚洲女人影院想要爱 | 黄色网址 在线播放 | 欧美一区二区三区性 | 亚洲精品国产第1页 | 欧美图片另类小说综合 | 国内精品一区二区三区最新 | 日本韩国视频 | 91视频综合| 亚洲精品国产专区91在线 | 中文字幕久久综合伊人 | 色婷婷香蕉| 国产亚洲精品观看91在线 | 精品一区二区三区免费 | 亚洲成人欧美 | 男人精品网站一区二区三区 | www.欧美视频.com | 99在线视频免费观看 |