前端面试系列:DOM事件类

一、基本概念:

DOM事件的级别

  • DOM0: element.onclick=function(){}
  • DOM2: element.addEventListener('click',function(){},false)
  • DOM3: element.addEventLListener('keyup',function(){},false) 增加了很多事件类型
    注意:true表示在捕获阶段触发,false表示在冒泡阶段触发,默认是false。
    DOM1没有设计和DOM事件相关相关的内容。

二、DOM事件模型

  • 事件捕获:从上往下找到目标元素
  • 事件冒泡:从目标元素往上查找

三、DOM事件流

浏览器为当前页面和用户做交互的过程中发生的过程,一个完整的事件流分三个阶段。

  • 事件捕获
  • 目标阶段
  • 事件冒泡
    事件通过捕获到达目标元素,这个时候就是目标阶段,第三个阶段就是从目标元素上传到window对象。

四、描述DOM事件捕获的具体流程

window——>document——>html——>body——>父级元素——>...——>目标元素

<body>
    <div id="ev">
        <style>
            #ev {
                width: 300px;
                height: 100px;
                background: #f00;
                color: #fff;
                text-align: center;
                line-height: 100px;
            }
        </style>
        目标元素
    </div>
    <script type="text/javascript">
        var ev = document.getElementById("ev");
        ev.addEventListener('click', function() {
            console.log("ev capture");
        }, true);
        window.addEventListener('click', function() {
            console.log("window capture");
        }, true);
        document.addEventListener('click', function() {
            console.log("document capture");
        }, true);
        document.documentElement.addEventListener('click', function() {
            console.log("html capture");
        }, true);
        document.body.addEventListener('click', function() {
            console.log("body capture");
        }, true);
    </script>
</body>

// 打印结果是
// window capture
// document capture
// html capture
// body capture
// ev capture

五、Event对象的常见应用

1、event.preventDefault():阻止默认行为
2、event.stopPropagation() :阻止冒泡行为
3、event.stopImmediatePropagation() :阻止其他事件,事件响应优先级。(若一个按钮绑定了两个或多个事件:事件a、事件b、……。当下场景想要实现点击按钮的时候只执行事件a,其他事件不执行,则在事件a的函数中加上event.stopImmeidiatePropagation()就能实现)
4、event.currentTarget :当前所被绑定的事件
5、event.target:当前被点击的元素(早期的ie版本不支持,早期ie用event.srcElement)

六、自定义事件(模拟事件)

1、自定义事件和自定义触发事件的过程(只能指定事件名,不能给事件加数据)

// 注册事件
var eve = new Event("test");
// ev就是普通的DOM节点
ev.addEventListener("test",function(){
    //绑定事件名称
    console.log("test");
},false);
// 此时是通过dispatchEvent自动触发事件,通常和其他事件结合使用
ev.dispatchEvent(eve);
// 延时5秒后触发
setTimeout(function() {
    ev.dispatchEvent(eve);
}, 5000);

2、除了指定事件名,还能给事件加一个Object,用来传递自定义参数

var eve = new Event("test", { detail: elem.dataset.time });
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,862评论 1 11
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 8,161评论 1 10
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 5,206评论 0 2
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 4,902评论 0 1
  • 事件流: 事件流:页面接收事件的顺序。 IE定义的:事件冒泡流(由最具体的元素依次传播到DOM树的最上层的Docu...
    xiaoguo16阅读 3,707评论 0 0