10-JS事件冒泡和事件捕获

  • 什么是事件?

    事件是一种通知机制,按照事件类型进行匹配

  • 事件侦听对象

    div.addEventListener("click",clickHandler); 
    

    addEventListener这个方法并没有对于clickHandler函数的返回结果做处理,因此clickHandler使用return无效

    可以给同一个元素绑定多个事件函数,多个事件的执行顺序和事件绑定的顺序一致

    function clickHandler(e){
         return;  // 事件函数中不要使用return
    }
    
    1. EventTarget所有继承这个类的类别都可以作为事件侦听对象,DOM
    2. 侦听对象和抛发对象必须相同,谁侦听,谁抛发
    3. 侦听事件类型和抛发事件类型必须相同
    var div = document.querySelector("div");
    div.addEventListener("nihao", nihaoHandler);
    
    var evt = new Event("nihao");
    evt.num = 10;
    div.dispatchEvent(evt);
    
    function nihaoHandler(e) {
        // e.type 事件类型
        console.log(e, evt);
        console.log(e === evt);   //true
    }
    
  • on事件和监听事件的区别

    1. onclick只能针对元素使用;addEventListener可以针对EventTarget使用(广泛)
    2. 使用on是不可以完成自定义事件,on语句基本上处理的是系统自带事件
    3. on事件兼容任何浏览器; addEventListener只支持IE8以上浏览器
    4. on事件同一个事件只能执行一个函数; addEventListener可以有多个
    5. on事件容易写成嵌套函数
    6. on事件无法区分捕获和冒泡事件
  • addEventListener事件侦听的参数

    1. 第一个参数是事件类型 type
    2. 第二个参数是事件回调函数
    3. 第三个参数是是否捕获阶段触发 默认是false(冒泡阶段) true是捕获阶段
    div0.addEventListener("click", clickHandler1, true);
    function clickHandler1(e){
         // this就是执行该函数的事件侦听对象, e.currentTarget也是事件侦听对象
         // e.target和e.srcElement 就是事件目标对象
         console.log("div0:",this,e.currentTarget,e.target,e.srcElement);
    }
    
    1. e.currentTarget当事件沿着 DOM 触发时事件的当前目标。它总是指向事件绑定的元素 。

    2. e.target触发事件的对象 (某个DOM元素) 的引用。

      当事件处理程序在事件的冒泡或捕获阶段被调用时,它与event.currentTarget不同。

  • 事件的三个处理过程

    捕获阶段(由外向内),目标阶段,冒泡阶段(由内向外)

  • 事件冒泡

    事件是可以流动的,它在触发时,默认情况下,会将事件向父元素进行传播,导致外层也被依次触发,直到页面的最顶层元素。 事件函数的执行顺序按照事件传播的顺序进行。我们称这种现象叫做: 事件冒泡。

    Image.png
  • 阻止事件冒泡

    var e = evt || event;
    // 1. if阻止事件冒泡;
    if(e.stopPropagation){
        // IE8 + 及高级浏览器;
        e.stopPropagation();
    }else{
        // 原本兼容IE8 , 目前所有浏览器都兼容;
        e.cancelBubble = true;
    }
    
    // 2. 三目运算;
    e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
    // 3. try{}catch(e){}
    
  • 删除事件

    • 删除事件函数

      document.onclick = function(){
          alert(1);
      }
      document.onclick = null;
      
    • 删除监听函数

      function handlerClick(){
          alert(1);
      }
      btn.addEventListener("click",handlerClick);
      btn.removeEventListener("click",handlerClick);
      //如果取出函数,那么每个事件的处理函数是独立的。程序设计更为清晰,能减少程序的耦合;
      
  • 事件委托机制

    注:通过event.target event.srcElement属性,我们可以找到事件触发的原始对象。

    1. 委托的好处:把元素触发事件时要执行的动作委托给父元素来执行
    2. 坏处:事件冒泡给父元素,会导致一些不该触发的事件被触发了
  • 将放在li中的监听给父级ul

     <ul id="list">
        <li>hello</li>
        <li>hello</li>
    </ul>
    var list = document.getElementById("list");
    list.onclick = function(evt) {
        var e = evt || event;
        var target = e.target || e.sreElement;
    
        if (target.nodeName === "LI") {
            var li = document.createElement("li");
            li.innerHTML = "Hello,I'm new Li"
            list.appendChild(li);
        }
    }
    
  • 当前事件的事件源

srcElement是IE下的属性,target是Firefox下的属性;Chorme浏览器同时有这两个属性

function(evt) {
  var e = evt || event;
  var target = e.target || e.sreElement;
}
  • 其他侦听事件

    1. change(input type=text value发生改变并且失焦; select菜单切换改变时触发 )
    2. submit reset (针对form表单事件 )
    3. select(针对input文本或者textArea文本,不是针对select表单 )
    4. error (当一个资源加载失败时会触发error事件 )
    5. load(是图片的src地址发生改变时,加载新内容完成后,触发 )
    6. resize(重置大小 解决window的大小变化 )
    7. scroll (针对任何有滚动条的容器)
  • 向页面中预加载图片

    function init() {
        var img = new Image();
        img.addEventListener("load", loadHandler);
        img.src = "./img/" + num + "-.jpg";//改变src的地址,触发img事件
    }
    
    function loadHandler(e) {
        // list.push(this);   //不能使用这种方法
        list.push(this.cloneNode(false));//参数为false代表浅拷贝
        num++;
        if (num > 79) {
            console.log("加载完成");
            this.removeEventListener("load", loadHandler);
            list.forEach(function(item) {
                console.log(item.src);
            })
            return;
        }
        this.src = "./img/" + num + "-.jpg";
    }
    console.log(list)
    
  • 封装选择器

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

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,026评论 0 2
  • 事件流 Click Me 冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标的顺序触发。触发的顺序是:di...
    醋留香阅读 785评论 0 1
  • 饥人谷事件课件 1.DOM0 事件和DOM2级在事件监听使用方式上有什么区别? DOM0事件有两种:一是在标签内写...
    饥人谷_米弥轮阅读 256评论 0 0
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,092评论 0 21
  • 转载:为了永久查看,我都cv 过来,省的原作者删除后找不到。 起因:1、这是前端面试的经典题型,要去找工作的小伙伴...
    七色烟火阅读 486评论 0 4