<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 一個JavaScript的timer的代碼

    時間:2024-10-22 23:48:04 JavaScript 我要投稿
    • 相關推薦

    一個JavaScript的timer的代碼

      比起as3的Timer類,功能上略有改動

      timer2.src.js

      復制代碼 代碼如下:

      /**

      * Timer 模型

      *

      * @author rainsilence

      * @version 2.0

      */

      (function() {

      /**

      * TimerEvent constructor 構造器

      *

      * @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 擴展類,對象的屬性或者方法

      *

      * @param target 目標對象

      * @param methods 這里改成param也許更合適,表示承載著對象,方法的對象,用于target的擴展

      */

      function extend(target, methods) {

      if (!target) {

      target = {};

      }

      for (var prop in methods) {

      target[prop] = methods[prop];

      }

      return target;

      }

      /**

      * Timer 構造器

      *

      * @param delay 延時多少時間執行方法句柄

      * @param repeatCount 重復多少次,如果不設置,代表重復無限次

      */

      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

      });

      };

      // 事件對象初始化(這部分未實現)

      var timerEvent = new TimerEvent(TimerEvent.TIMER, false, false);

      var timerCompleteEvent = new TimerEvent(TimerEvent.TIMER_COMPLETE, false, false);

      /**

      * Timer 計時器方法

      *

      * @method addEventListener 增加一個方法句柄(前兩個參數必須,后一個參數可選)

      * @method removeEventListener 移除一個方法句柄

      * @method start 開始計時器

      * @method stop 結束計時器

      * @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;

      }

      });

      })();

      接下來測試吧,大家見過新浪網上的滾動顯示嗎?用setTimeout寫的,真叫牛叉。。。。。。換成Timer重構,簡單易懂

      timerTest.html

      復制代碼 代碼如下:

      .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;

      }

      1

      2

      3

      4

      addEventListener的useCapture參數本為捕獲階段觸發之意,現在改成如果true,則在其他句柄之前觸發,如果false,則在其他句柄之后觸發。

      后記:

      現在貌似大家比較流行評論說明書的用法。。。比如struts+spring+hibernate。而忽略了編程的實質。希望大家多看源碼,多討論源碼,那樣才會有所謂的思想。否則人家今天用這個framework,明天換了。你又要從頭開始了。

    【一個JavaScript的timer的代碼】相關文章:

    高效編寫JavaScript代碼的技巧08-25

    在Java中執行JavaScript代碼07-14

    JavaScript實現網頁刷新代碼段08-07

    常用排序算法之JavaScript實現代碼段06-04

    網頁程序設計之實用JavaScript代碼段09-23

    關jQuery彈出窗口簡單實現代碼-javascript編程06-07

    關于TimerTask與Timer類的應用09-04

    關于ASP.NET使用JavaScript顯示信息提示窗口實現原理及代碼05-09

    對javascript的理解08-08

    常用的JavaScript模式09-22

    主站蜘蛛池模板: 亚洲国产精品无码av| 97精品一区二区视频在线观看 | 无码精品人妻一区二区三区免费看| 在线电影国产精品| 精品无码人妻夜人多侵犯18| 日韩精品欧美亚洲| 99久久精品免费观看国产| 国产精品多人p群无码| 中文字幕一区二区三区日韩精品 | 国产精品一区在线播放| 无码人妻精品一区二区| 欧美XXXX黑人又粗又长精品| 国产69精品久久久久9999| 国产精品一久久香蕉国产线看 | 亚洲日韩欧美制服精品二区| 国产精品V亚洲精品V日韩精品| 91在线视频精品| 国产精品一区二区久久国产| 一本之道av不卡精品| 久久精品夜色噜噜亚洲A∨| 91精品国产成人网在线观看| 55夜色66夜色国产精品视频| 日韩精品无码中文字幕一区二区| 欧美精品色婷婷五月综合 | 国产精品二区观看| 日韩精品在线一区二区| 91探花福利精品国产自产在线| 久久精品国产亚洲av麻豆小说| 中文字幕精品无码久久久久久3D日动漫| 久久精品国产一区二区三区| 国产精品热久久毛片| 99久久精品无码一区二区毛片| 久久精品男人影院| 久久免费精品视频| 天天爽夜夜爽精品视频app| 久久国产精品国产自线拍免费 | 亚洲精品乱码久久久久久蜜桃图片 | 日韩精品无码久久久久久| 午夜精品一区二区三区免费视频| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 国产精品网址在线观看你懂的|