js版事件管理器

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

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

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

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

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

           
           
          // 事件的調用
           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){
                           
          // 不做任何提示
                       }

                   }

               }

           }

           
           
          // 執行攔截器
           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){
                       
          // 不做任何提示
                   }

               }

           }

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

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

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

           
           
          // 刪除方法執行后的攔截器
           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(
          "新增動作");
              }

              
              
          function beforeNewEvent(){
                  alert(
          "新增動作執行前");
              }

              
              
          function validatorNewEvent(){
                  alert(
          "執行校驗攔截器");
              }

              
              
          function afterNewEvent(){
                  alert(
          "新增動作執行后");
              }


              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 閱讀(2118) 評論(1)  編輯  收藏 所屬分類: Javascript

          評論

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

          不錯的JS機制,MK一下.  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 梅州市| 永顺县| 志丹县| 博湖县| 芦溪县| 漯河市| 泸定县| 宣化县| 于都县| 冕宁县| 称多县| 普洱| 长子县| 奉新县| 黄山市| 绍兴县| 嵊州市| 南开区| 湾仔区| 清涧县| 施秉县| 双峰县| 廊坊市| 西昌市| 霍林郭勒市| 大田县| 石景山区| 龙陵县| 绥棱县| 娄底市| 新河县| 沂水县| 鹿泉市| 肥西县| 文昌市| 蒲城县| 南开区| 伊通| 磐石市| 镶黄旗| 光泽县|