Javascript 访问事件处理程序中的事件对象

Javascript 访问事件处理程序中的事件对象,javascript,javascript-events,Javascript,Javascript Events,当我尝试使用以下参数附加事件处理程序函数时: myhandle.onclick = myfunction(param1,param2); function myfunction(param1,param2){ } 现在我想在我的处理函数中访问事件对象。web上提到了一种发送事件对象的方法,如: myhandle.onclick = myfunction(event,param1,param2); 但当我测试它时,它的给定事件对象未定义 我知道库可以让这些东西变得简单,但我正在寻找一个原生J

当我尝试使用以下参数附加事件处理程序函数时:

myhandle.onclick = myfunction(param1,param2);

function myfunction(param1,param2){
}
现在我想在我的处理函数中访问事件对象。web上提到了一种发送事件对象的方法,如:

myhandle.onclick = myfunction(event,param1,param2);
但当我测试它时,它的给定事件对象未定义

我知道库可以让这些东西变得简单,但我正在寻找一个原生JS选项。

试试这个:

if (!event) { event = window.event; }

在myfunction()的内部。

我不完全确定您想要做什么,但也许您正在寻找类似的东西

function myfunction(param1, param2){
    return function(event) {
        // For compatibility with IE.
        if (!event) {
            event = window.event;
        }

        alert("event = " + event + ", param1 = " + param1 + ", param2 = " + param2);
    };
}

myhandle.onclick = myfunction(param1, param2);
这样做的最终结果是,
myfunction
中的匿名函数将被称为
onclick
处理程序,从而导致打印事件和两个参数。这两个参数在添加事件处理程序时是固定的,而
event
将在用户每次单击
myhandle
时更改

myhandle.onclick=myfunction(param1,param2)

这是JavaScript级别的初学者常见错误,而不是库可以真正为您解决的问题

您没有将
myfunction
指定为单击处理程序,而是调用
myfunction
,使用param1和param2作为参数,并将函数的返回值指定给
onclick
myfunction
不返回任何内容,因此您将
undefined
分配给
onclick
,这将无效

您的意思是为
myfunction
本身指定一个引用:

myhandle.onclick= myfunction;
要向函数传递一些额外的参数,必须创建一个包含其值的闭包,这通常是通过匿名内联函数完成的。如果您需要,它也可以负责传递事件(尽管无论哪种方式,您都需要IE的备份计划,在IE中,事件对象不作为参数传递):

在未来的JavaScript版本ECMAScript第五版中,您可以更轻松地编写:

myhandle.onclick= myfunction.bind(window, param1, param2);
(使用
窗口
作为
的虚拟值,在本例中不需要该值。)

然而,由于当今的许多浏览器不支持第五版,如果您想使用这种方法,您必须为较旧的浏览器提供一个实现。有些图书馆已经包括了一个;这里是另一个独立的

if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        var args= Array.prototype.slice.call(arguments, 1);
        return function() {
            return that.apply(owner,
                args.length===0? arguments : arguments.length===0? args :
                args.concat(Array.prototype.slice.call(arguments, 0))
            );
        };
    };
}
if (!('bind' in Function.prototype)) {
    Function.prototype.bind= function(owner) {
        var that= this;
        var args= Array.prototype.slice.call(arguments, 1);
        return function() {
            return that.apply(owner,
                args.length===0? arguments : arguments.length===0? args :
                args.concat(Array.prototype.slice.call(arguments, 0))
            );
        };
    };
}