传参之事件代理

  通常情况下,我们使用事件机制时,编写的事件处理函数只需要一个参数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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值