我正在学习如何在 JavaScript 中操作事件,我想知道"为什么在使用事件处理时必须将事件对象作为参数(参数)传递到函数中?
这是我所说的一个例子:
<script type="text/javascript">
document.getElementById('button_1').onclick = (function (event) {
alert("The event is: " + "on" + event.type);
});
</script>
我写了上面的代码,我几乎理解它的作用。我只是不明白整个(事件)过去。我认为这是一种将匿名函数分配给button_1.onclick
事件处理程序的方法。事件处理程序是否在分配事件之前尝试传入事件,或者?...我很难理解这一点。如果有人能为我澄清这一点,我将不胜感激。
[我尝试在谷歌上搜索它,但发现了非常复杂的解释和例子。只有简单到中间的解释会有所帮助。=)
永远存在的事件,不管你喜欢与否
事件始终存在,即使您未提供名称也是如此:
$(".foo").on("click", function(){
alert( arguments[0].type );
});
这和这样说是一样的:
$(".foo").on("click", function(event){
alert( event.type );
});
事件对象已经传递给你的回调(无论你是否为它提供了名称),如果你愿意,你可以选择不使用它。例如,如果我们查看jQuery onClick方法:
$(".foo").on("click", function(){
/* Do stuff */
});
利用它
您会注意到我的回调中没有引用事件对象。我不需要。但是,如果我想使用它,无论出于何种目的,我都应该给它起一个名字:
$(".foo").on("click", function(myEvent){
myEvent.preventDefault();
myEvent.stopPropagation();
});
现在我已经授予自己访问事件详细信息的权限,我可以阻止事件导致的默认行为,还可以阻止事件将 DOM 冒泡到其他元素。
实际示例
假设我们想侦听一个元素上的点击事件:
$("#bigSquare").on("click", function(event){
/* Do something */
});
单击元素本身或其任何子元素时,该元素上会发生单击事件。现在假设此元素有两个子元素:
<div id="bigSquare">
<div id="redSquare"></div>
<div id="blueSquare"></div>
</div>
单击其中任何一个,大方块、红色方块或蓝色方块将导致大方块上的"点击"事件 - 在它导致您首先单击的任何元素上的点击事件(事件在 DOM 中冒泡)。
我们可以通过事件本身确定哪个元素是任何点击事件中的目标:
$("#bigSquare").on("click", function(event){
alert( event.target.id );
});
请注意此处我们如何访问引发事件的目标的 ID。如果您单击红色方块,当该事件冒泡到大方块时,我们将看到警报"红色方块"。蓝色方块也是如此。如果您单击该按钮,事件将冒泡到大广场,我们将看到警报"蓝色方块"。
您可以通过以下演示在线测试:http://jsbin.com/ejekim/edit#javascript,live
尝试单击橙色、红色或蓝色方块以查看收到警报的内容。
您没有将 event
参数传递到任何地方。 你只是在做一个函数,它接受一个参数,叫做 event
。
当浏览器调用事件处理程序时,它会调用分配给它的函数,并将event
对象作为第一个参数传递给它。
附言您不需要围绕函数的()
。
document.getElementById('button_1').onclick = function (event) {
alert("The event is: " + "on" + event.type);
};
您不是将事件传递到函数中,而是将传递给函数的第一个参数命名为 event
。
是将要调用函数的浏览器,它在调用函数时会传递一个事件对象。 您可以选择不将该参数命名function(){}
但浏览器仍将传递事件对象,您可以根据需要使用它或不使用它。
简单地说,传递给处理程序的 Event 对象包含有关事件的详细信息。例如,KeyboardEvent
包含有关按下的键、相应的字符以及按住的任何修饰键(alt、shift、control、meta)的信息。
事件处理程序是否在分配事件之前尝试传入事件?
处理程序是你的函数,所以它是event
的接收者,而不是传递者。
- 将事件处理程序分配给元素的
onclick
属性(或通过调用addEventListener
,现代首选方法)时,即在调用处理程序之前绑定事件处理程序。 - Event 对象在调用处理程序时传递,即事件触发时。
因此,当用户单击您的#button_1
时,这会导致按钮上触发"click"事件,该事件调用按钮的"click"处理程序,该处理程序将传递MouseEvent
。
有关更多信息,请阅读事件驱动编程。
为了添加其他答案和注释,您的代码不适用于 IE。对于跨浏览器功能,您需要测试第一个参数是否存在:
<body>
<button id="button_1">Click Me!</button>
<script type="text/javascript" >
document.getElementById('button_1').onclick = (
function(event) {
var e = event ? event : window.event;
alert("The event is: " + "on" + e.type);
});
</script>
</body>