前端面试宝典

event(事件)工具集,

来源:github.com/markyun

markyun.Event = {
    // 页面加载完成后
    readyEvent: function (fn) {
        if (fn == null) {
            fn = document;
        }
        var oldonload = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = fn;
        } else {
            window.onload = function () {
                oldonload();
                fn();
            };
        }
    },
    // 视能力分别使用 dom0||dom2||IE 方式 来绑定事件
    // 参数: 操作的元素,事件名称 ,事件处理程序
    addEvent: function (element, type, handler) {
        if (element.addEventListener) {
            //事件类型、需要执行的函数、是否捕捉
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent('on' + type, function () {
                handler.call(element);
            });
        } else {
            element['on' + type] = handler;
        }
    },
    // 移除事件
    removeEvent: function (element, type, handler) {
        if (element.removeEnentListener) {
            element.removeEnentListener(type, handler, false);
        } else if (element.datachEvent) {
            element.detachEvent('on' + type, handler);
        } else {
            element['on' + type] = null;
        }
    },
    // 阻止事件 (主要是事件冒泡,因为 IE 不支持事件捕获)
    stopPropagation: function (ev) {
        if (ev.stopPropagation) {
            ev.stopPropagation();
        } else {
            ev.cancelBubble = true;
        }
    },
    // 取消事件的默认行为
    preventDefault: function (event) {
        if (event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },
    // 获取事件目标
    getTarget: function (event) {
        return event.target || event.srcElement;
    },
    // 获取 event 对象的引用,取到事件的所有信息,确保随时能使用 event;
    getEvent: function (e) {
        var ev = e || window.event;
        if (!ev) {
            var c = this.getEvent.caller;
            while (c) {
                ev = c.arguments[0];
                if (ev && Event == ev.constructor) {
                    break;
                }
                c = c.caller;
            }
        }
        return ev;
    }
};

onload 和 DOMContentLoaded的区别

考点:页面加载过程

window.addEventListener('load',()=>{
	// 页面的全部资源加载完才会执行,包括图片、视频等
})

document.addEventListener('DOMContentLoaded',()=>{
	// DOM 渲染完即可执行,此时图片、视频可能还没有加载完
})

什么是事件冒泡

一个事件触发后,会在子元素和父元素之间传播,这种传播分为三个阶段

  • 捕获阶段--从外到里(从window对象传导目标节点,这个阶段不会响应任何事件)
  • 目标阶段(在目标节点上触发)
  • 冒泡阶段--从里到外(从目标节点传导回window对象)

事件委托/事件代理就是利用事件冒泡的机制把里层需要响应的事件绑定到外层。