事件委托与冒泡、事件捕获

事件委托:利用冒泡的原理,把事件加到父级上,触发执行效果。

例子:

<ul id="ull">
    <li>1</li>
    <li>1</li>
    <li>1</li>
    <li>1</li>
    <li>1</li>
    <li>1</li>
    <li>1</li>
</ul>
//一般写法
    var li=document.getElementsByTagName("li");
    for(var i=0;i<li.length;i++){
        li[i].onclick=function () {
            console.log("1")
        }
    }
//缺点:绑定多个事件,并且如果后续有新添加的节点li,需要重新绑定onclick事件

//事件代理
    var ull=document.getElementById("ull");
    ull.addEventListener("click",function (e) {
        var target=e.target;
        if(target.nodeName.toUpperCase()=="LI") {
            console.log("1")
            stopPropagation(e)//阻止继续向上冒泡
        }
    });

事件冒泡:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。(target-body-html-document)

<div id="div2">
    <ul id="ull">
        <li>1</li>
        <li>1</li>
        <li>1</li>
        <li>1</li>
        <li>1</li>
        <li>1</li>
        <li>1</li>
    </ul>
</div>

假设给div和li都绑定了click事件,那么当点击li时,会先后(从内到外)触发这两个click事件,如果不想要这样的结果,那么就需要阻止冒泡

//阻止事件冒泡
    function stopPropagation(e) {
        if (e.stopPropagation) {
            e.stopPropagation();//Firefox
        } else {
            e.cancelBubble = true;//IE
        }
    }

事件捕获:与事件冒泡的顺序相反(IE没有事件捕获)

W3C模型

W3C模型是将两者进行中和,在W3C模型中,任何事件发生时,先从顶层开始进行事件捕获,直到事件触发到达了事件源元素。然后,再从事件源往上进行事件冒泡,直到到达document。
一般的绑定事件方式,如:onclick,采用的是冒泡方式。
但我们可以选择事件处理函数在哪一个阶段被调用。
addEventListener有三个参数:

element.addEventListener(event, function, useCapture)
//第三个参数默认值是false,表示在事件冒泡的阶段调用事件处理函数,如果参数为true,则表示在事件捕获阶段调用处理函数
<div  id="div1" style="width: 500px;background-color: yellow">
    <div id="div2" style="width: 50%;background-color: aqua;margin: 0 auto">
        <ul id="ull" style="width: 50%;background-color: coral;margin: 0 auto">
            <li>1</li>
            <li>1</li>
            <li>1</li>
            <li>1</li>
            <li>1</li>
            <li>1</li>
            <li>1</li>
        </ul>
    </div>
</div>
//事件捕获
    var div1=document.getElementById("div1");
    var div2=document.getElementById("div2");
    var ull=document.getElementById("ull");
    div2.addEventListener("click",function () {
        console.log('div2')
    },true);    //捕获时执行
    div1.addEventListener("click",function () {
        console.log('div1')
    });//
    ull.addEventListener("click",function () {
        console.log('ull')
    });
    
    //点击ul,依次打印出div2,ull,div1

参考:
https://segmentfault.com/a/1190000000749838
http://www.jb51.net/article/42492.htm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 背景知识 什么是事件?直观的说就是网页上发生的事情,大部分是指用户的鼠标动作和键盘动作,如点击、移动鼠标、按下某个...
    吧啦啦小汤圆阅读 1,829评论 2 15
  • (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。 (2)捕获型...
    逍遥g阅读 433评论 2 0
  • 传统的绑定方式 element.onclick = function(e){// ...}; 传统绑定的优点非常简...
    小飞侠zzr阅读 260评论 0 0
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,316评论 0 8
  • 夜晚一阵风,裹挟着一片枯黄地树叶 带着沙粒般地质感划过有尘土地大地 夜,黑漆漆 沉重而美丽 那沉重又美丽地夜晚 如...
    文艺饭团阅读 219评论 0 0