为什么必须将事件对象作为参数传递



我正在学习如何在 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>

相关内容

  • 没有找到相关文章

最新更新