可以给html属性onchange、onclick等传递什么参数?

What parameters can you pass to html attribute onchange, onclick, etc.?

当我开始学习 javascript 时,我认为浏览器会简单地 运行 元素的 javascript in onclick 属性,就好像它在脚本标签中一样。但是我意识到情况并非如此,因为您可以在这些属性中使用某些参数。例如 onclick="foo(this, event)" 将触发的事件和触发事件的元素传递给函数 foo。

我想知道这些标签内还可以使用哪些其他参数? w3schools 上的文档没有提及任何相关内容。我也想知道这些属性是如何实现的;该函数是如何调用的以及在什么范围内调用(我知道 foo 将被称为 element.foo() 但对于其他 javascript 表达式而言并非如此)。任何地方都有全面的文档吗?我目前最好的猜测是实现看起来像这样:

element.onclickfunction = function(){
    var event = new Event(...)
    eval(element.onclick)
}

编辑: none 的回复确实回答了我的问题。我很想知道还有哪些其他特殊参数可以传递给事件处理程序中指定的函数,以及如何将参数 this 解释为元素。我选择了最佳答案,因为他向描述 EventHandler 接口的 mdn 提供了 link。

在 JavaScript 中,您可以在任何 DOM 元素、文档本身、上下文 window 或任何其他支持事件的对象上注册事件侦听器。在一大堆网络标准中定义了一大堆事件。 Mozilla Developer Network.

是列出这些内容的好资源

注册到事件的EventListener只接受一个参数:事件。可以看到它只有一个方法handleEvent,只接受一个参数

要将其他内容传递给事件处理程序,您可以利用闭包或 bind()。我要借用 this answer 来演示 bind() 是如何工作的:

elem.addEventListener(function(a1, a2, e) {
    // inside the event handler, you have access to both your arguments
    // and the event object that the event handler passes
}.bind(elem, arg1, arg2));

elemarg1arg2绑定到函数上,意味着函数的this变为elem,前两个参数函数变成 arg1arg2e 参数仍然是触发函数的事件,就像往常一样。当您想将事件处理程序外部的内容传递到处理程序内部时,这样的绑定非常有用。您可以阅读更多关于 bind() here.

关于您关于onclick()的具体问题,原理基本相同,只是您将特定的点击事件处理程序注册到一个元素。它也只接受一个参数,那就是 MouseEvent 对象。但与任何函数一样,您仍然可以将其他参数绑定到它。有关详细信息,请参阅 here