当前位置: 代码迷 >> Web前端 >> 传参之事件署理
  详细解决方案

传参之事件署理

热度:101   发布时间:2012-08-31 12:55:03.0
传参之事件代理
  通常情况下,我们使用事件机制时,编写的事件处理函数只需要一个参数event就可以了,但是有时,如果需要用到额外的数据, 又不想新建自定义事件类时,就可以用到这种支持参数的事件处理函数了,这种方式是在网上看到的,这里收集整理一下。其原理是利用函数的返回值返回一个带有基本事件类作参数的函数,用这个返回值作事件的处理函数,因为这个函数是在另一个函数中返回的,所以它在具备普通的事件处理函数的功能的前提下又可以扩展出我们想要的功能。下面是代码:
    function createParamHandler(handler:Function,... arg):Function {
       var flag:Boolean=false;
       var result:Function=function(event:*):void{
           var handlerParams:*=arg;//事件参数之外的额外参数
           if(!flag){
              flag=true;//确保只添加一次事件参数
              handlerParams.unshift(event);//添加事件参数
           }
           handler.apply(null,handlerParams);//在新的事件处理函数被调用时执行原函数
       }
       return result;//返回一个新的事件处理函数
    }
    var handler:Function = createParamHandle(mouseDownHandler,"param1","param2");
    stage.addEventListener(MouseEvent.MOUSE_DOWN, handler);
    function mouseDownHandler(event:MouseEvent,...arg) {//原函数
       trace(arg);
    }

  为了便于使用,做成一个类,调用静态方法完成新的处理函数的创建
package
{
        public class ParamsHandlerUtils
        {
                public function ParamsHandlerUtils()
                {
                }
                
                static function createParamsHandler(method:Function,...arg):Function {
                                var isAddEventParams:Boolean = false;
                                var result:Function = function(event:*){
                                                var params:* = arg;
                                                if(!isAddEventParams){
                                                        isAddEventParams = true;
                                                        params.unshift(event);
                                                }
                                                method.apply(null,params);
                                        }
                                return result;
                        }
                }
        }
}


使用:
var handler:Function = ParamsHandlerUtils.createParamHandle(mouseDownHandler,"param1","param2");
stage.addEventListener(MouseEvent.MOUSE_DOWN,handler);
function mouseDownHandler(e:MouseEvent,...arg) {
        trace(arg);
}


  感谢原作者,这里把原来的代码转一下:
function create(f:Function,... arg):Function {
    var F:Boolean=false;
   var _f:Function=function(e:*){
    var a:*=arg
      if(!F){
      F=true
      a.unshift(e)
    };
   f.apply(null,a);
    };
   return _f;
  }
stage.addEventListener(MouseEvent.MOUSE_DOWN,create(mouseDownHandler,"a","b"));
function mouseDownHandler(e:MouseEvent,...arg) {
  trace(arg);
}

  相关解决方案