Event 事件模型

111 阅读1分钟

QQ图片20230327182215.gif

事件流

 <div id="app">
        <p id="dom">Click</p>
    </div>
  • 事件冒泡: p -> div -> body -> HTML -> document
  • 时间捕获: document -> HTMl -> body -> div -> p

事件处理程序

     DOM2 事件处理程序
     el.addEventListener(event, function, useCapture)
     el.removeEventListener(event, function, useCapture)
     //useCapture : true 表示在捕获阶段调用事件处理程序,false(默认值)表示在冒泡阶段调用事 件处理程序
     
     阻止默认事件传播
     event.preventDefault()
     
     阻止事件的传播
     event.stopPropagation();
    IE 事件处理程序     
    el.attachEvent(event, function)
    el.detachEvent(event, function)
    //attachEvent()添加的事件处理程序会添加到冒泡阶段。
    
    阻止默认事件传播
    window.event.returnValue = false
    阻止事件的传播
    window.event.returnValue = true;

手写事件绑定

attachEvent & addEventListener 区别

  • a. 传参 attachEvent对于事件名加上'on'
  • b. 执行顺序,attachEvent - 后绑定先执行;addEventListener - 先绑定先执行
  • c. 解绑 detachEvent vs removeEventListener
  • d. 阻断 e.cancelBubble = true vs e.stopPropagation()
  • e. 默认事件打断 e.returnValue vs e.preventDefault

class bindEvent {
        constructor(element) {
            this.element = element;
        }

        addEventListener = (type, handler) => {
            if (this.element.addEventListener) {
                this.element.addEventListener(type, handler, false);
            } else if (this.element.attachEvent) {
                const element = this.element;
                this.element.attachEvent('on' + type, () => {
                    handler.call(element);
                });
            } else {
                this.element['on' + type] = handler;
            }
        }

        removeEventListener = (type, handler) => {
            if (this.element.removeEventListener) {
                this.element.removeEventListener(type, handler, false);
            } else if (this.element.detachEvent) {
                const element = this.element;
                this.element.detachEvent('on' + type, handler);
            } else {
                this.element['on' + type] = null;
            }
        }

        static stopPropagation(e) {
            if(e.stopPropagation) {
                e.stopPropagation();
            } else {
                e.cancelBubble = true;
            }
        }

        static preventDefault(e) {
            if(e.preventDefault) {
                e.preventDefault();
            } else {
                e.returnValue = true;
            }
        }
    }