1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. 一個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

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>