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

pbgvytdp  于 2023-01-01  发布在  Java
关注(0)|答案(3)|浏览(129)

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

myhandle.onclick = myfunction(param1,param2);

function myfunction(param1,param2){
}

现在我想在我的处理函数中访问事件对象。在发送事件对象的网页上提到了一种方法,如:

myhandle.onclick = myfunction(event,param1,param2);

但是当我测试它的时候,它的给定事件对象没有定义。
我知道库使这件事很容易,但我正在寻找一个原生的JS选项。

6yjfywim

6yjfywim1#

我的句柄.onclick =我的函数(参数1,参数2);
这是JavaScript级别上常见的初学者错误,不是库可以真正修复的。
您没有将myfunction指定为单击处理程序,而是调用myfunction,将param 1和param 2作为参数,并将函数的返回值指定为onclickmyfunction不返回任何值,因此您将undefined指定为onclick,这不会产生任何效果。
你的意思是给myfunction本身赋一个引用:

myhandle.onclick= myfunction;

为了传递一些额外的参数,你必须创建一个包含这些参数值的闭包,这通常是通过匿名内联函数来完成的,如果需要的话,它也可以负责传递事件(尽管无论哪种方式,你都需要为IE做一个备份计划,因为IE的事件对象不是作为参数传递的):

myhandle.onclick= function(event) {
    myfunction(param1, param2, event);
};

在ECMAScript Fifth Edition中(这将是JavaScript的未来版本),您可以更轻松地编写以下代码:

myhandle.onclick= myfunction.bind(window, param1, param2);

(with windowthis的虚拟值,在本例中不需要。)
然而,由于今天的许多浏览器不支持第五版,如果你想使用这种方法,你必须为老的浏览器提供一个实现。下面是另一个独立示例。

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))
            );
        };
    };
}
cqoc49vn

cqoc49vn2#

我不太清楚你想干什么,但也许像这样的东西就是你要找的?

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时更改。

7ajki6be

7ajki6be3#

试试这个:

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

在myfunction()内部。

相关问题