<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无码精品| 中文字幕日韩精品在线| 亚洲av午夜国产精品无码中文字| 国产精品高清视亚洲精品| 中文国产成人精品久久不卡| 国产乱码伦精品一区二区三区麻豆| 国产99视频精品免视看7 | 国产成人精品视频一区二区不卡| 欧美XXXX黑人又粗又长精品| 国产精品电影在线| 久久青青草原国产精品免费| 国产精品原创巨作av女教师| 亚洲精品无码鲁网中文电影| 久久伊人精品青青草原日本| 国产精品永久免费| 国产高清在线精品一本大道| 四虎影视884a精品国产四虎 | 久久亚洲国产成人精品性色| 日韩视频中文字幕精品偷拍| 精品日本一区二区三区在线观看 | 亚洲精品高清无码视频| 欧美精品福利在线视频| wwwvr高清亚洲精品二区| 久久国产精品99久久久久久老狼| 国产乱人伦偷精品视频免下载| 无码日韩精品一区二区免费暖暖| 亚洲无码精品浪潮| 亚洲精品第一国产综合精品99| 欧美精品黑人粗大欧| 久久精品国产99久久丝袜| 久久久无码精品午夜| 久久久亚洲精品蜜桃臀| 欧美久久亚洲精品| 欧美精品福利视频一区二区三区久久久精品| 精品91自产拍在线观看| 国产精品成人免费观看| 黑人巨大精品欧美一区二区| 精品亚洲一区二区三区在线观看| 久久国产精品视频| 亚洲精品在线视频| 精品亚洲aⅴ在线观看|