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

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

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

    js版事件管理器

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

    /*
     * ============================================================
     * Copyright (C) 2006 
     * ------------------------------------------------------------
     * CVS $Author: BlueDavy $
     * ------------------------------------------------------------
     * 事件管理器
     * 1、事件的注冊/反注冊
     * 2、事件的調(diào)用
     * 3、事件的攔截器(事件執(zhí)行前和事件執(zhí)行后)
     * TODO:事件執(zhí)行的有效范圍
     *       攔截器的有效范圍
     *       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"
         
     }

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

         }

     }

     
     
    // 注冊方法執(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);
     }

     
     
    // 注冊方法執(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(
    "新增動作");
        }

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

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

        
        
    function afterNewEvent(){
            alert(
    "新增動作執(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 閱讀(2108) 評論(1)  編輯  收藏 所屬分類: Javascript

    評論

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

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

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導(dǎo)航

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

    統(tǒng)計(jì)

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 又大又黄又粗又爽的免费视频| 亚洲AV无一区二区三区久久| 久久WWW色情成人免费观看| 久久青草91免费观看| 久久夜色精品国产亚洲av | eeuss影院www天堂免费| a拍拍男女免费看全片| 亚洲AV美女一区二区三区| 二级毛片免费观看全程| 亚洲av再在线观看| 偷自拍亚洲视频在线观看99| 免费黄网在线观看| 亚洲国产av玩弄放荡人妇| 四虎www免费人成| 久久精品熟女亚洲av麻豆| 免费一级做a爰片久久毛片潮喷| 亚洲日韩国产欧美一区二区三区 | 国产h视频在线观看免费| 亚洲成人一级电影| 成人爽A毛片免费看| 亚洲欧洲无卡二区视頻| 伊在人亚洲香蕉精品区麻豆| 日韩在线视频播放免费视频完整版| 亚洲 国产 图片| a色毛片免费视频| 亚洲一区在线视频| 亚洲国产精品无码久久久久久曰| 一个人看的在线免费视频| 久久亚洲精品中文字幕无码| 国产成人精品免费视频动漫| 亚洲精品久久久久无码AV片软件| 亚洲日本韩国在线| 8888四色奇米在线观看免费看| 亚洲中文字幕久久久一区| 精品国产亚洲男女在线线电影 | 99久久99久久精品免费观看| 国产成人精品日本亚洲18图| 亚洲综合色自拍一区| 免费看污成人午夜网站| 中文永久免费观看网站| 国产精品亚洲精品青青青|