js版事件管理器

          寫的一個(gè)比較簡單的事件管理器,主要從這些方面進(jìn)行的考慮:
          1、實(shí)現(xiàn)事件的注冊(cè)/反注冊(cè)。
          2、實(shí)現(xiàn)事件的調(diào)用。
          3、注冊(cè)事件的攔截器(方法執(zhí)行前或執(zhí)行后)。
          目前寫的這個(gè)版本還比較簡單,后一步需要增加事件的有效范圍以及事件的攔截器的有效范圍的支持,就是scope的概念,還有一個(gè)需要改進(jìn)的地方是將目前事件調(diào)用的部分改為COR模式。
          源碼如下:

          /*
           * ============================================================
           * Copyright (C) 2006 
           * ------------------------------------------------------------
           * CVS $Author: BlueDavy $
           * ------------------------------------------------------------
           * 事件管理器
           * 1、事件的注冊(cè)/反注冊(cè)
           * 2、事件的調(diào)用
           * 3、事件的攔截器(事件執(zhí)行前和事件執(zhí)行后)
           * TODO:事件執(zhí)行的有效范圍
           *       攔截器的有效范圍
           *       COR Pattern
           * ============================================================
           
          */

           
          var EventManager=Class.create();
           
           
          // 事件集合
           EventManager.events={};
           
           
          // 注冊(cè)事件
           EventManager.registerEvent=function(eventalias,event){
               EventManager.events[eventalias]
          =event;
           }

           
           
          // 反注冊(cè)事件
           EventManager.unregisterEvent=function(eventalias){
               EventManager.events[eventalias]
          =null;
           }

           
           
          // 攔截器集合
           EventManager.interceptors={};
           
           
          // 攔截器常量定義
           EventManager.Interceptor={
               
               BEFORE:
          "before",
               
               AFTER:
          "after"
               
           }

           
           
          // 事件的調(diào)用
           EventManager.invoke=function(eventalias){
               
          return function(){
                   
          var bindevent=EventManager.events[eventalias];
                   
          if(bindevent!=null){
                       
          try{
                           EventManager.invokeInterceptor(eventalias,EventManager.Interceptor.BEFORE);
                           bindevent.apply(
          this,[event]);
                           EventManager.invokeInterceptor(eventalias,EventManager.Interceptor.AFTER);
                       }

                       
          catch(e){
                           
          // 不做任何提示
                       }

                   }

               }

           }

           
           
          // 執(zhí)行攔截器
           EventManager.invokeInterceptor=function(eventalias,type){
               
          var typeInterceptors=EventManager.interceptors[type];
               
          if(typeInterceptors==null){
                   
          return;
               }

               
          var interceptors=typeInterceptors[eventalias];
               
          if(interceptors==null){
                   
          return;
               }

               
          for(var i=0;i<interceptors.length;i++){
                   
          try{
                       interceptors[i].apply(
          this,[event]);
                   }

                   
          catch(e){
                       
          // 不做任何提示
                   }

               }

           }

           
           
          // 注冊(cè)方法執(zhí)行前的攔截器
           EventManager.addBeforeInterceptor=function(eventalias,interceptor){
               EventManager.addInterceptor(eventalias,interceptor,EventManager.Interceptor.BEFORE);
           }

           
           
          // 刪除方法執(zhí)行前的攔截器
           EventManager.removeBeforeInterceptor=function(eventalias,interceptor){
               EventManager.removeInterceptor(eventalias,interceptor,EventManager.Interceptor.BEFORE);
           }

           
           
          // 注冊(cè)方法執(zhí)行后的攔截器
           EventManager.addAfterInterceptor=function(eventalias,interceptor){
               EventManager.addInterceptor(eventalias,interceptor,EventManager.Interceptor.AFTER);
           }

           
           
          // 刪除方法執(zhí)行后的攔截器
           EventManager.removeAfterInterceptor=function(eventalias,interceptor){
               EventManager.removeInterceptor(eventalias,interceptor,EventManager.Interceptor.AFTER);
           }

           
           
          // 添加攔截器
           EventManager.addInterceptor=function(eventalias,interceptor,type){
               
          var typeInterceptors=EventManager.interceptors[type];
               
          if(typeInterceptors==null){
                   typeInterceptors
          ={};
               }

               
          var interceptors=typeInterceptors[eventalias];
               
          if(interceptors==null){
                   interceptors
          =new Array();
               }

               interceptors.push(interceptor);
               typeInterceptors[eventalias]
          =interceptors;
               EventManager.interceptors[type]
          =typeInterceptors;
           }

           
           
          // 刪除攔截器
           EventManager.removeInterceptor=function(eventalias,interceptor,type){
               
          var typeInterceptors=EventManager.interceptors[type];
               
          if(typeInterceptors==null){
                   
          return;
               }

               
          var interceptors=typeInterceptors[eventalias];
               
          if(interceptors==null){
                   
          return;
               }

               interceptors.remove(interceptor);
               typeInterceptors[eventalias]
          =interceptors;
               EventManager.interceptors[type]
          =typeInterceptors;
           }


          示例如下:

          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html;charset=GBK" /> 
          <title>::事件管理器示例::</title>
          <script src="js/prototype.js"></script>
          <script src="js/EventManager.js"></script>
          </head>
          <body>
              
          <input type=button name=btnTest value=演示>
          </body>
          <script>

              
          function newEvent(){
                  alert(
          "新增動(dòng)作");
              }

              
              
          function beforeNewEvent(){
                  alert(
          "新增動(dòng)作執(zhí)行前");
              }

              
              
          function validatorNewEvent(){
                  alert(
          "執(zhí)行校驗(yàn)攔截器");
              }

              
              
          function afterNewEvent(){
                  alert(
          "新增動(dòng)作執(zhí)行后");
              }


              EventManager.registerEvent(
          "newevent",newEvent);
              EventManager.addBeforeInterceptor(
          "newevent",beforeNewEvent);
              EventManager.addBeforeInterceptor(
          "newevent",validatorNewEvent);
              EventManager.addAfterInterceptor(
          "newevent",afterNewEvent);
              
              $('btnTest').onclick
          =EventManager.invoke("newevent");

          </script>
          </html>

          posted on 2006-03-09 15:29 BlueDavy 閱讀(2112) 評(píng)論(1)  編輯  收藏 所屬分類: Javascript

          評(píng)論

          # re: js版事件管理器 2007-07-27 17:28 sitinspring

          不錯(cuò)的JS機(jī)制,MK一下.  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統(tǒng)計(jì)

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 衢州市| 承德县| 新营市| 房产| 阿拉善左旗| 重庆市| 上蔡县| 汪清县| 澄迈县| 江华| 定远县| 利辛县| 东平县| 蒙山县| 海门市| 无为县| 甘南县| 朔州市| 永年县| 吴旗县| 通道| 自治县| 内乡县| 玉环县| 柞水县| 来宾市| 芜湖县| 双柏县| 凤台县| 巧家县| 明光市| 德江县| 灵石县| 武冈市| 化隆| 鞍山市| 平潭县| 苍山县| 潮安县| 林周县| 武威市|