<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    傳統javascript事件模型實現觀察者模式

    Posted on 2007-03-16 09:19 dennis 閱讀(1894) 評論(0)  編輯  收藏 所屬分類: web開發
    ??? 在W3C新的事件模型框架中,IE和Mozilla都實現了相應的版本,IE的是attachEvent和detachEvent來實現元素事件的添加和刪除,而Mozilla則是標準的addEventListener和 removeEventListener。在傳統的javascript事件模型中,我們沒辦法為一個頁面元素注冊多個事件,只有靠自己來實現觀察者模式。代碼來自《ajax in action》,我添加了注釋
    //命名空間
    var?jsEvent?=?new?Array();

    //構造函數
    jsEvent.EventRouter?=?function(el,eventType){
    ?
    //內部維護一個事件列表
    ?this.lsnrs?=?new?Array();
    ?
    this.el?=?el;
    ?el.eventRouter?
    =?this;
    ?
    //注冊回調函數
    ?el[eventType]?=?jsEvent.EventRouter.callback;
    };

    //添加事件
    jsEvent.EventRouter.prototype.addListener?=?function(lsnr){
    ?
    this.lsnrs.append(lsnr,true);?
    }?;

    //移除事件
    jsEvent.EventRouter.prototype.removeListener=
    function(lsnr){?
    this.lsnrs.remove(lsnr);?
    };?

    //通知所有事件
    jsEvent.EventRouter.prototype.notify?=?function(e){
    ?
    var?lsnrs?=?this.lsnrs;
    ?
    for(var?i=0;i<lsnrs.length;i++){
    ??
    var?lsnr?=?lsnrs[i];
    ??lsnr.call(
    this,e);
    ?}
    };
    //回調函數調用notify
    jsEvent.EventRouter.callback=function(event){
    ?
    var?e?=?event?||?window.event;
    ?
    var?router?=?this.eventRouter;
    ?router.notify(e);
    };

    Array.prototype.append?
    =?function(obj,nodup){
    ?
    if(nodup){?
    ??
    this[this.length]=obj;
    ?}
    };
    Array.prototype.remove?
    =?function(o)
    {
    ???
    var?i?=?this.indexOf(o);
    ???
    if?(i>-1)
    ??{
    ????
    this.splice(i,1);
    ???}
    ?????
    return?(i>-1);
    ???}??
    };?

    這里比較巧妙的就是
    ?el.eventRouter?=?this;
    //注冊回調函數
    ?el[eventType]?=?jsEvent.EventRouter.callback;

    首先給el元素添加屬性
    eventRouter是當前的EventRouter對象,然后,比如eventType假設為onclick,el是一個button元素,那么這里就是el[onclick]=jsEvent.EventRouter.callback;相當于el.onclick=jsEvent.EventRouter.callback;
    而請注意這個回調函數
    callback將首先得到元素的eventRouter對象,再調用此對象的notify方法觸發所有注冊的事件。

    再請注意notify函數里面這一行:
    ?lsnr.call(this,e);

    我們把event對象傳入此函數作參,而
    var?e?=?event?||?window.event;那么所有事件函數的第一個參數都將是event對象,避免了IE需要通過window.event得到的事件對象的瀏覽器不一致行為。

    使用此對象方式:
     var?mat=document.getElementById('mousemat');
      cursor
    =document.getElementById('cursor');
      
    var?mouseRouter=new?jsEvent.EventRouter(mat,"onmousemove");
      mouseRouter.addListener(writeStatus);
      mouseRouter.addListener(drawThumbnail);?


    主站蜘蛛池模板: 亚洲AV日韩AV鸥美在线观看| 亚洲日韩在线中文字幕综合| 一级日本高清视频免费观看| 日韩一区二区在线免费观看 | 伊在人亚洲香蕉精品区麻豆| 亚洲精品成a人在线观看☆| 18禁超污无遮挡无码免费网站国产| 亚洲黄色在线电影| 亚洲丰满熟女一区二区哦| 岛国av无码免费无禁网站| 亚洲日韩精品国产3区| 久热免费在线视频| 在线观着免费观看国产黄| 久久久久久久久无码精品亚洲日韩 | 亚洲日本中文字幕| h视频在线观看免费完整版| 亚洲Av无码一区二区二三区| 成人性生免费视频| 日韩毛片一区视频免费| 亚洲狠狠婷婷综合久久久久| 日韩精品内射视频免费观看 | 亚洲精品日韩专区silk| 成人免费无码大片a毛片| 黄色免费网站在线看| 久久国内免费视频| 中文字幕乱码亚洲精品一区| 亚洲av麻豆aⅴ无码电影| a级毛片毛片免费观看久潮| 免费A级毛片无码A| 中文字幕手机在线免费看电影| 亚洲av片劲爆在线观看| 成人免费a级毛片| 成人嫩草影院免费观看| 91情国产l精品国产亚洲区| 日本免费一区二区三区最新| 日韩毛片在线免费观看| 99亚洲精品高清一二区| 亚洲M码 欧洲S码SSS222| 亚洲第一se情网站| 久久久久亚洲精品美女| 免费羞羞视频网站|