【问题标题】:Event Handlers and Listeners & Event Bubbling and Event Capturing事件处理程序和侦听器以及事件冒泡和事件捕获
【发布时间】:2015-09-12 23:55:54
【问题描述】:

我对 JavaScript 中的“事件侦听器”、“事件处理程序”、“事件冒泡”和“事件捕获”感到困惑。

我在互联网上搜索并查看了不同的网站,但我仍然无法理解一些差异甚至基本情况。

正如this article 建议的那样,创建事件处理程序并侦听事件。

  • 这是否意味着,附加到 DOM 内部元素的 JavaScript 函数不是事件处理程序,它们是事件侦听器?

另外,here 我发现了“事件冒泡”和“事件捕获”之间的区别。另外,我前段时间读到dojo 中的所有事件都由<body> 标签捕获。

  • 这是否意味着没有 JavaScript 附加到 DOM 内的其余元素?

  • 更准确地说,如果事件要由父级通过“事件冒泡”处理,那么是否不需要向子级添加侦听器?

这些术语背后的准确定义是什么?

【问题讨论】:

  • 据我所知,一个事件处理程序被绑定到 dom 中的一个项目一次,并且无论在监听器绑定后是否加载了 dom 内容,一个事件监听器都会触发

标签: javascript jquery events dojo handler


【解决方案1】:

事件处理程序/事件监听器

事件侦听器和事件处理程序之间没有区别 - 出于所有实际目的,它们是相同的。但是,以不同的方式思考它们可能会有所帮助:

我可以定义一个“处理程序”...

function myHandler( e ){ alert('Event handled'); }

...并使用 'addEventListener' 将其附加到多个元素:

elementA.addEventListener( 'click', myHandler );
elementB.addEventListener( 'click', myHandler, true );

或者,我可以将我的“处理程序”定义为“addEventListener”中的闭包:

elementC.addEventListener( 'click', function( e ){ alert('Event Handled'); } );

事件捕获/事件冒泡

您可以将事件捕获视为与事件冒泡相反 - 或事件生命周期的两个部分。 DOM 元素可以嵌套(当然)。一个事件首先 CAPTURES 从最外层的父级到最内层的子级,然后是 BUBBLES 从最内层的子级到最外层的父级。

您可能已经注意到,在我上面的示例中,附加到 elementB 的侦听器有一个附加参数 - true - 没有传递给 elementA。这告诉监听器在 CAPTURE 阶段响应事件,而默认情况下它会在 BUBBLE 阶段响应。在 jsfiddle.net 上试试这个:

假设我们有 3 个嵌套的 div 元素:

<div id="one">
    1
    <div id="two">
        2
        <div id="three">
            3
        </div>
    </div>
</div>

...我们为每个附加一个“点击”处理程序:

document.getElementById('one').addEventListener( 'click', function(){ alert('ONE'); } );
document.getElementById('two').addEventListener( 'click', function(){ alert('TWO'); }, true );
document.getElementById('three').addEventListener( 'click', function(){ alert('THREE') } );

如果您点击“1”,您将看到一个带有文本“ONE”的警告框。

如果您点击“2”,您将看到一个警告框“TWO”,然后是一个警告框“ONE”(因为在 CAPTURE PHASE 期间首先触发了“two”,并且'one' 在BUBBLE PHASE的途中被触发)

如果您点击“3”,您会看到一个警告框“TWO”(CAPTURED),然后是一个警告框“THREE”(BUBBLED),后跟一个警告框“ONE”(BUBBLED)。

一清二楚对吧?

【讨论】:

  • 您的意思是每当我点击任何元素时,我都会调用附加到冒泡阶段所有祖先的处理程序?我的意思是,这种冒泡什么时候会停止?在您的示例中,它将调用所有处理程序,直到它到达没有附加任何内容的父级或直到它到达主体?
  • 是的,未选中它会冒泡到 激活每个正在监听事件的父母......除非你特别阻止它。如果您不希望事件继续发生,您可以在处理程序后添加一个“stopPropogation”调用以停止事件冒泡。
  • 谢谢。只是为了确认!因此,在您的示例中,如果没有附加到 div #2 的处理程序,当我单击 div #3 时,我会看到警报框“一”,然后是“三”,因为冒泡通过了没有附加处理程序的父级你也没有停止冒泡。对吗?
  • 还有一个问题!!如果 div#3 没有附加任何东西会发生什么?如果我点击没有事件处理程序的 div #3,我能看到“TWO”然后是“ONE”吗?
  • 如果没有附加到 #2 的处理程序并且您单击 #3 您会看到“三”然后是“一”,因为这些事件正在 BUBBLE(从内到外)而不是捕捉(从外到内)。如果没有附加到 #3 的处理程序并且您单击 #3 则是的,您会看到“TWO”(捕获)然后“ONE”(BUBBLE)。
猜你喜欢
  • 2017-01-13
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多