事件冒泡和事件捕获

2021-04-10  本文已影响0人  my木子

事件

事件流

DOM事件流

image.png
// html
        <body>
            <button>
                <span>点击</span>
            </button>
        </body>
// js
        var body =document.querySelector('body');
        var button =document.querySelector('button');
        var span =document.querySelector('span');

        // DOM 0级
        // body.onclick=function(){
        //     console.log('body');
        // }
        // button.onclick=function(){
        //     console.log('button');
        // }
        // span.onclick=function(){
        //     console.log('span');
        // }

        // DOM 2级
        /**
            element.addEventListener(event,function,useCapture);
            第一个参数是事件的类型(如“click”或“mousedown”)
            第二个参数是事件触发后调用的函数。
            第三个参数是个布尔值用于描述事件是冒泡(false)还是捕获(true),该参数是可选的。
        */
        body.addEventListener('click',function(){
            console.log('body');
        },true);
        button.addEventListener('click',function(){
            console.log('button');
        },true);
        span.addEventListener('click',function(){
            console.log('span');
        },true);

        // body.addEventListener('click',function(){
        //     console.log('body');
        // },false);
        // button.addEventListener('click',function(){
        //     console.log('button');
        // },false);
        // span.addEventListener('click',function(){
        //     console.log('span');
        // },false);

阻止冒泡

    // 阻止事件冒泡
    function stopBubble(e) {
        if (e && e.stopPropagation) {
            e.stopPropagation(); // W3C
        } else {
            window.event.cancelBubble = true; // IE
        }
    }

    // 阻止事件默认行为
    return false;
    event.preventDefault();

事件委托

移动端300ms点击延迟

  1. 通过 meta 标签禁用网页的缩放
<meta name="viewport" content="user-scalable=no">
<meta name="viewport" content="initial-scale=1,maximum-scale=1">
  1. 调用一些 js 库,比如 FastClick(推荐),原理:在检测到 touchend 事件的时候,会通过 DOM 自定义事件立即出发模拟一个 click 事件,并把浏览器在300ms之后真正的 click事件 阻止掉。
  2. CSS touch-action 属性,直接将所有的其他手势事件全都禁用掉,便能达到消除延迟的目的,但是这个属性在很多浏览器中都存在不兼容的问题,而且当设置完这个属性之后,页面的滚动也会随之被禁用,慎用。

点击穿透

通用事件侦听器函数

const EventUtils = {
  // 视能力分别使用dom0||dom2||IE方式 来绑定事件
  // 添加事件
  addEvent: function(element, type, handler) {
    if (element.addEventListener) {
      element.addEventListener(type, handler, false);
    } else if (element.attachEvent) {
      element.attachEvent("on" + type, handler);
    } else {
      element["on" + type] = handler;
    }
  },

  // 移除事件
  removeEvent: function(element, type, handler) {
    if (element.removeEventListener) {
      element.removeEventListener(type, handler, false);
    } else if (element.detachEvent) {
      element.detachEvent("on" + type, handler);
    } else {
      element["on" + type] = null;
    }
  },

  // 获取事件目标
  getTarget: function(event) {
    return event.target || event.srcElement;
  },

  // 获取 event 对象的引用,取到事件的所有信息,确保随时能使用 event
  getEvent: function(event) {
    return event || window.event;
  },

  // 阻止事件(主要是事件冒泡,因为 IE 不支持事件捕获)
  stopPropagation: function(event) {
    if (event.stopPropagation) {
      event.stopPropagation();
    } else {
      event.cancelBubble = true;
    }
  },

  // 取消事件的默认行为
  preventDefault: function(event) {
    if (event.preventDefault) {
      event.preventDefault();
    } else {
      event.returnValue = false;
    }
  }
};
上一篇 下一篇

猜你喜欢

热点阅读