[转]addEventListener的第三个参数

如果要把HTML元素的事件与某个函数绑定起来,可以有下面三种方法,以最常见的“点击”事件为例。

方法一

直接在对应的HTML元素标签上绑定函数

?


1

<button id=‘submit‘ onclick=‘onClickFn()‘>Click Me!</button>

方法二

在JavaScript代码里面指定元素的“onclick”方法

?


1

2

3

var btn = document.getElementById(‘submit‘);

btn.onclick = onClickFn;

方法三

使用事件监听绑定方法

?


1

2

3

var btn = document.getElementById(‘submit‘);

btn.addEventListener(‘click‘, onClickFn, false);

三种方法都可以在button被点击的时候调用onClickFn函数,但是有所区别。

第一种方法不推荐,因为违反了HTML与JavaScript分离的准则;

第二种方法只能给一个事件绑定一个响应函数,重复绑定会覆盖之前的绑定;

第三种方法比较推荐,可以绑定多个不同的函数。

不过退步推荐不是重点,重点是第三种方法中的第三个参数为何是“false”?

当鼠标点击所看到的的按钮时,其实发生了一系列的事件传递,可以想象一下,button实际上是被body“包裹”起来的,body是被html“包裹”起来的,html是被document“包裹”起来的,document是被window“包裹”起来的。所以,在你的鼠标点下去的时候,最先获得这个点击的是最外面的window,然后经过一系列传递才会传到最后的目标button,当传到button的时候,这个事件又会像水底的泡泡一样慢慢往外层穿出,直到window结束。

综上,一个事件的传递过程包含三个阶段,分别称为:

捕获阶段,目标阶段,冒泡阶段

目标指的就是包裹得最深的那个元素。

假设HTML有如下元素:

?


1

2

3

4

5

<div id=‘d‘>

    <p id=‘p‘>

        <span id=‘s‘>Click Me!</span>

    </p>

</div>

JavaScript代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

var div = document.getElementById(‘d‘);

var p = document.getElementById(‘p‘);

var span = document.getElementById(‘s‘);

function onClickFn (event) {

    var tagName = event.currentTarget.tagName;

    var phase = event.eventPhase;

    console.log(tagName, phase);

}

div.addEventListener(‘click‘, onClickFn, false);

p.addEventListener(‘click‘, onClickFn, false);

此时,点击“Click Me!”,即可在控制台看到如下结果:

?


1

2

P 3

DIV 3

其中“3”和“冒泡阶段”对应。

可以看出,p和div都是在冒泡阶段相应了事件,由于冒泡的特性,裹在里层的p率先做出响应。

如果把上面代码里面中addEventListener的第三个参数设置为true,那么运行的结果如下:

?


1

2

DIV 1

P 1

由此,addEventListener的第三个参数设置为true和false的区别已经非常清晰了:

true表示该元素在事件的“捕获阶段”(由外往内传递时)响应事件;

false表示该元素在事件的“冒泡阶段”(由内向外传递时)响应时间。

至此,你可能会有疑问,还有一个“目标阶段”呢?

您不妨给span元素绑定事件,自己测试一下。

冒泡阶段,如果不希望事件继续往上传播,例如,冒泡的p的时候就停止传播,那么,可以在p的事件回调函数里面这么写:

?


1

2

3

4

function onClickFn (event) {

    // code here

    event.stopPropagation();

}

这样,冒泡到p的时候,就不会再向上传播了,即,div不会收到冒泡上来的click事件。

如果还想把其它与p绑定的响应函数的事件也“屏蔽”掉,需要把stopPropagation换为stopImmediatePropagation。

来源:

http://my.oschina.net/u/1454562/blog/205010

可参考:

http://www.neoease.com/stoppropagation-and-preventdefault-and-return-false/

时间: 2024-11-09 13:06:47

[转]addEventListener的第三个参数的相关文章

addEventListener 的三个参数

addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click"):第二个参数表示要接收事件处理的函数:第三个参数为 useCapture,本文就讲解它. <div id="outDiv">   <div id="middleDiv">     <div id="inDiv">请在此点击鼠标.</div>   </div> <

js中addEventListener第三个参数涉及到的事件捕获与冒泡

js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型,比如点击(click).触摸(touchstart), 第二个参数就是事件函数, 比如我给一个button添加alert函数. window.onload=function(){ document.getElementById("hello").addEventListener("

JavaScript addEventListener 第三个参数作用

DOM方法 addEventListener() 和 removeEventListener()是用来分配和删除事件的函数. 这两个方法都需要三个参数,分别为: 事件名称(String).要触发的事件处理函数(Function).指定事件处理函数的时期或阶段(boolean). <!--打开新的浏览器窗口--> <button id="New" onclick="">点击弹窗</button> <!--关闭新的浏览器窗口--

addListener添加事件监听器,第三个参数useCapture (Boolean) 的作用

addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click"):第二个参数表示要接收事件处理的函数:第三个参数为 useCapture,本文就讲解它. <div id="outDiv"> <div id="middleDiv"> <div id="inDiv">请在此点击鼠标.</div> </div> </div>

js-addEventListener()第三个参数useCapture

概述: 第3个参数叫做useCapture,是一個boolean值,就是true or false .如果送出true的話就是瀏覽器會使用Capture方式,false的話是Bubbling,只有在特定狀況下才會有影響,通常建議是false,而會有影響的情形是目標元素(target element)有祖先元素(ancestor element),而且也有同樣的事件對應函數 html片段 <div id="div1" style="background: blue;wid

三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

版权声明:本文为sang原创文章,转载请注明出处. 目录(?)[+] 关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东.本篇博客我们不讲源码,只看使用.源码的解读会在下一篇博文中带来. inflate方法从大范围来看,分两种,三个参数的构造方法和两个参数的构造方法.在这两类中又有细分,OK,那我们就把各种情况都来演示一遍. 1.三个参数的in

public View getView(int position, View convertView, final ViewGroup parent)三个参数的意思

最近看到有人在问这三个参数的含义,其实帮助已经很详细的介绍了这三个参数,看来还是要好好学学英语了,不然连解释都看不懂. /**     * Get a View that displays the data at the specified position in the data set. You can either     * create a View manually or inflate it from an XML layout file. When the View is inf

Html.RenderPartial使用三个参数

Html.RenderPartial("usercontrolurl", model, ViewDataDictionary) 当使用三个参数时可以这样使用: var data = new ViewDataDictionary(); data.Add("key", "value"); Html.RenderPartial("usercontrolurl", model, data); 然后在用户控件处使用:ViewData[&

异步任务类AnsycTask的三个参数

异步任务类AnsycTask为抽象类,其三个泛型参数为:Params,Progress 和 Result,这三个参数类型由用户设定,可以为任何类型,分别对应如下三个方法: 1.doInBackground(Params...):该方法运行在子线程中,处理一些耗时的任务,如网络和数据库的操作.一般,Params 类型可以设为 Void: 2.onProgressUpdate(Progress...):子线程中的publishProgress()方法被调用后,UI 线程将调用onProgressUp