JS的事件流模型

js的事件流模型

事件捕抓:是一种以从上至下的的方式进行传播。以click事件为例,它会从最外层的根节点到达点击的节点。它是从最外层的根节点逐渐向目标节点传输的方式。

事件冒泡: 是一种从下之上的方式的传播方式,同样用click事件为例,事件由被点击的根节点开始往上传播直至点击的最外层根节点。

DOM0级模型(原始事件模型)

这种方式较为简单,并且兼容所有浏览器。但是却将界面与逻辑耦合在一起,可维护性很差。

例子
    <!DOCTYPE html>
<html>
<head>
    <title>JS事件流模型</title>
</head>
<style type="text/css">
    div{
        display: flex;
        justify-content: center;
        align-items: center;
    }
</style>

<body>
    <div id="i1" style="height: 150px;width: 150px;background: red;" onclick="alert(0)">
        <div id="i2" style="height: 100px;width: 100px;background: green;" onclick="alert(1)">
            <div id="i3" style="height: 50px;width: 50px;background: blue;" onclick="alert(2)"></div>
        </div>
    </div>
</body>
</html>

当点击idi3div时,浏览器会返回2 1 0

IE事件模型

ie8之前的版本是不支持事件捕获的。
IE的事件模型分为两个过程:
事件处理阶段: 事件到达目标元素,触发目标元素的监听事件
事件冒泡阶段: 事件从目标元素冒泡到document,依茨执行经过的节点绑定的事件。

DOM2级模型

DOM2事件模型是W3C制定的标准模型,支持捕获型事件和冒泡型事件,调用事件的处理阶段分为捕获,目标,冒泡

实例

当点击idi3div时,浏览器会依次弹出0 1 3 2,addEventListener方法的第三个参数为声明绑定的事件为捕获型还是冒泡型,默认为false,也就是冒泡型

<!DOCTYPE html>
   <html>
   <head>
       <title>JS事件流模型</title>
   </head>
   <style type="text/css">
       div{
           display: flex;
           justify-content: center;
           align-items: center;
       }
   </style>

   <body>
       <div id="i1" style="height: 150px;width: 150px;background: red;">
           <div id="i2" style="height: 100px;width: 100px;background: green;">
               <div id="i3" style="height: 50px;width: 50px;background: blue;"></div>
           </div>
       </div>
   </body>

   <script type="text/javascript">
       document.addEventListener('click',(e) => {
           alert(0);
       },true) 
       document.getElementById("i1").addEventListener('click',(e) => {
           alert(1);
       },true) 
       document.getElementById("i2").addEventListener('click',(e) => {
           alert(2);
       })  
       document.getElementById("i3").addEventListener('click',(e) => {
           alert(3);
       })     
   </script>
</html>

document对象与i1节点绑定的是捕获型的监听事件,i2i3节点绑定的是冒泡型事件。

window --- document --- html --- body --- i1 --- i2 --- i3 --- i2 --- i1 --- body --- html --- document --- window

windowi3过程为捕获阶段,依次执行了过程中绑定的事件,本例中执行了alert(0)和alert(1),然后到达了目标阶段i3,执行i3绑定的事件alert(3),然后从i3window的阶段为冒泡阶段。执行了alert(2),执行顺序为0 1 3 2


绑定监听事件使用的区别

DOM0中直接绑定函数执行时,后定义的函数会覆盖前面定义的函数。click()是一个对象事件,点击即触发onclick()绑定的方法,onclick()是对象的属性,将其绑定函数后即为click()事件触发后执行的方法

    <!DOCTYPE html>
<html>
<head>
    <title>JS事件流模型</title>
</head>
<style type="text/css">
    div{
        display: flex;
        justify-content: center;
        align-items: center;
    }
</style>

<body>
    <div id="i1" style="height: 150px;width: 150px;background: red;"></div>
</body>

<script type="text/javascript">

    document.getElementById("i1").onclick = function(){
        alert(0);
    } // 被覆盖

    document.getElementById("i1").onclick = function(){
        alert(1);
    } // 执行
    
</script>
</html>

addEventListener可以为事件绑定多个函数,并且绑定时不需要加on,而且它还可以接受三个参数useCapture来决定事件时绑定的捕获阶段还是冒泡阶段执行。

    document.getElementById("i1").addEventListener('click',(e) => {
        alert(0);
    }) // 执行

    document.getElementById("i1").addEventListener('click',(e) => {
        alert(1);
    }) // 执行

attachEvent可以为事件绑定多个函数,绑定时需要加on,其只支持冒泡阶段执行,所以不存在第三个参数。

   document.getElementById("i1").attachEvent('onclick',function(e){
       alert(0);
   }) // 执行

   document.getElementById("i1").attachEvent('onclick',function(e){
       alert(1);
   }) // 执行
Tips
  • 关于addEventListenerattachEvent的区别。

IE不支持addEventListener和removeEventListner。在ie为了实现类似功能是使用attachEvent和detachEvent

  • 关于兼容性

attachEvent——兼容:IE7、IE8;不兼容firefox、chrome、IE9、IE10、IE11、safari、opera
addEventListener——兼容:firefox、chrome、IE、safari、opera;不兼容IE7、IE8


原文:https://www.cnblogs.com/WindrunnerMax/p/12558442.html
部分参考内容:https://www.jianshu.com/p/4af0476a08c9

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