函数怎么传event对象

来源:互联网 发布:java用户信息管理系统 编辑:程序博客网 时间:2024/06/08 08:59

兼容 DOM 的浏览器会将一个 event 对象传入到事件处理程序中。无论指定事件处理程序时使用什么方法(DOM1 级或 DOM2 级),都会传入 event 对象。下面是一个event对象传递的小例子:

var btn = document.getElementById("myBtn");btn.onclick = function(event){  console.log(event.type);         // "click"};btn.addEventListener("click", function(event){  console.log(event.type);         // "click"}, false);

注意:IE中,不支持直接接收,而是通过window.event来接收

对于跨浏览器事件处理方式来说,,那么现在问题来了,如下所示,如果事件处理程序handler()(或者其它DOM2级事件处理程序)需要传入event对象,怎么办??

function handler(event,arg){  var event = event?event:window.event;  alert(event.type);  alert(arg);}

像这样直接在addHandler()中的第三个参数也加入包含event的参数列表可不可以呢?
EventUtil.addHandler(btn,"onclick",handler(event,arg));

没错,,答案是确实不可以。。那是为什么呢?

因为在DOM中,event对象只能作为仅有的参数传给事件处理程序!!也就是说,在普通函数(自定义事件处理函数)中,是不可以传递event对象的!

所以,,EventUtil.addHandler(btn,"onclick",handler(event,arg)); 并不能把event对象传递到handler事件处理程序中。

这特么就很尴尬了,那该怎么办呢?

事件处理程序的参数传递问题的解决方式有以下几种:

* 不保留事件对象直接传入参数
var btn=document.getElementById("myBtn");function handler(arg1,arg2){    alert(arg1);    alert(arg2);}E.addHandler( btn,"click",handler(arg1,arg2));
* 保留事件对象作为第一个参数
var btn=document.getElementById("myBtn");function handler(event,arg1,arg2){    alert(event.type);    alert(arg1);    alert(arg2);}E.addHandler( btn,"click",function(event){handler(event,arg1,arg2);} );

缺点: 对事件处理函数包装后,移除事件的时候会变得麻烦。

* 给Function.prototype添加getCallback方法,不保留事件对象
var btn=document.getElementById("myBtn");Function.prototype.getCallBack = function(){    var _this = this, args = arguments;     //arguments是包含传入函数中的所有参数的数组    return function(event) {        return _this.apply(this || window, args);    };}E.addHandler(btn,"click",handler.getCallBack([args]));     //[args]表示参数列表
* 给Function.prototype添加getCallBack()方法,保留事件对象作为第一个参数传入
var btn=document.getElementById("myBtn");Function.prototype.getCallBack = function(){    var _this = this, args = arguments;    return function(event) {        args.unshift(event);        return _this.apply(this || window, args);    };}E.addHandler(btn,"click",handler.getCallBack([args]));

缺点:给Function的原型添加自定义方法后,污染了原生JS,慎用!

原创粉丝点击