前言

通过如下两个实例来理解DOM事件

  1. 实例1--点击别处关闭浮层
  2. onclick与addEventListener的区别

  3. 实例2--点击后颜色一层一个层出现的漂亮的彩虹圈

1  实例1--点击别处关闭浮层

  • 代码效果演示:原生JSjQuery
  • HTML代码
      <div id="wrapper" class="wrapper">
    <button id="clickMe">点我</button>
    <div id="popover" class="popover">
    <input type="checkbox">浮层
    </div>
    </div>
  • CSS代码
    .wrapper{
    display:inline-block;
    position: relative;
    } .popover{
    display: none;
    border: 1px orange solid;
    top: 0px;
    /*宽度是上级元素的100%*/
    left: %;
    padding: 8px;
    border-radius: 4px;
    position: absolute;
    background: white;
    /*规定段落中的文本不进行换行*/
    white-space: nowrap; }
    /*画浮层左边的小指向箭头*/
    .popover::before{
    position: absolute;
    right: %;
    top: 4px;
    border: 10px solid transparent;
    border-right-color: orange;
    content: '';
    }
    .popover::after{
    position: absolute;
    right: %;
    top: 4px;
    border: 10px solid transparent;
    border-right-color: white;
    content: '';
    margin-right: -1px;
    }
  • JS代码-原生js 
    /*点击按钮触发浮层*/
    clickMe.addEventListener('click', function(){
    popover.style.display = 'block'
    })
    /*阻止默认事件*/
    wrapper.addEventListener('click', function(e){
    e.stopPropagation()
    })
    /*点击任意处关闭浮层*/
    document.addEventListener('click', function(){
    popover.style.display = 'none'
    })
  • JS代码-jQuery
    $(clickMe).on('click',function(){
    $(popover).show()
    /*如果不加定时器会同步执行show()和hide(),即看起来什么都没有发生*/
    setTimeout(function(){
    $(document).one('click', function() {
    $(popover).hide()
    })
    },)
    })

2  onclick与addEventListener的区别

  • 实例1使用的原生JS,为什么使用addEventListener(),而不使用onclick() --onclick()只能添加一个事件,多个事件时只会输出最后一个,而实例1中存在多个事件,不能用onclick()
  • onclick与addEventListener实际上可分为:Inline events与Event Listeners
  • Event Listeners (“addEventListener” and “IE's attachEvent”)
    • 两者相同点:都是时间监听器。
    • 两者不同点:
      • addEventListener:很多浏览器支持addEventListener(IE9、IE10、IE11、chrome、firefox、opera、safari支持),使用方式如下:

        //addEventListener接受三个参数,最后一个参数默认是false。(false表示事件处理将在冒泡阶段执行,true表示事件处理将在捕获阶段执行)
        //addEventListener(type,listener,options)
        var target = document.getElementById("test");
        target.addEventListener('click',function test(){
        console.log("Hi");
        },false)
      • attachEvent:IE中提供的类似addEventListener的事件监听器,使用方式如下:

        //qqq
        var target = document.getElementById("test");
        target.attachEvent('onclick',test);
        function test(){
        console.log("Hi");
        }
      • 理论上,Event Listeners (addEventListener and IE's attachEvent)可以无限增加事件监听给某个一元素。实际应用的约束就是客户端内存的限制,这一点因每个浏览器而异

        var target = document.getElementById("test");
        target.addEventListener('click',function test(){
        console.log("Hi");
        },false)
        target.addEventListener('click',function test(){
        console.log("Hello");
        },false)
        //Hi
        //Hello
  • Inline events (“HTML onclick="" property” and “element.onclick”)
    • 使用方式:
      • onclick=""    

        <a id="test" href="#" onclick="function()">clickMe</a>
      • element.onclick      

        <a id="test" href="#">clickMe</a>
        
        var target = document.getElementById('test')
        target.onclick = function(){
        console.log('Hi');
        }
      • Inline events只能添加一个事件,如果同时有多个,只会输出最后一个的结果   

        var target = document.getElementById('tttt')
        target.onclick = function(){
        console.log('Hi');
        }
        target.onclick = function(){
        console.log('Hello');
        }
        //Hello

         

  • Inline events与Event Listeners的区别:Event Listeners可以添加无数个(理论上)事件,Inline events只能添加1个事件,且下面的会覆盖上面的。
 

3  实例2--点击后颜色一层一个层出现的漂亮的彩虹圈

  • 代码效果:彩虹圈
  • HTML代码
    <div class="red">
    <div class="blue">
    <div class="green">
    <div class="yellow">
    <div class="orange">
    <div class="purple"> </div>
    </div>
    </div>
    </div>
    </div>
    </div>
  • CSS代码
    *{margin:;padding:;box-sizing:border-box;}
    
    //设置背景颜色
    .red.active { background: red; }
    .blue.active { background: blue; }
    .green.active { background: green; }
    .yellow.active { background: yellow; }
    .orange.active { background: orange; }
    .purple.active { background: purple; } //设置一层一层圆圈以及动画过渡事件
    div {
    border: 1px solid black;
    padding: 10px;
    transition: all .5s;
    display: flex;
    flex:;
    border-radius: %;
    background: white;
    } //设置最外圈的长宽
    .red{ width: 100vw; height: 100vw; }
  • JS代码
    let divs = $('div').get()
    let n = for (let i = ; i < divs.length; i++) {
    //addEventListener()最后一个参数为true
    //即执行捕获阶段--从外层到里层,即从爷爷到儿子
    divs[i].addEventListener('click', function() {
    setTimeout(function() {
    divs[i].classList.add('active')
    }, n * )
    n +=
    }, true)
    } for (let i = ; i < divs.length; i++) {
    //addEventListener()最后一个参数为false
    //即执行冒泡阶段--从里层到外层,即从儿子到爷爷
    divs[i].addEventListener('click', function() {
    setTimeout(function() {
    divs[i].classList.remove('active')
    }, n * )
    n +=
    }, false)
    } //⚠️有一个特殊情况:即如果都是自己身上同时捕获(true)和冒泡(false),此时执行顺序和捕获(true)和冒泡(false)无关,谁在前面就先执行哪个

深度理解DOM事件(实例)的更多相关文章

  1. 理解DOM事件流的三个阶段

    本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...

  2. javascript:理解DOM事件

    首先,此文不讨论繁琐细节,但是考虑到读者的心灵感受,本着以积极向上的心态,在此还是会列举示例说明. ​标题为理解DOM事件,那么在此拿一个简单的点击事件为例,希望大家看到这个例子后能触类旁通. DOM ...

  3. 从click事件理解DOM事件流

    事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...

  4. 深度理解DOM拷贝clone()

    克隆节点是DOM的常见操作,jQuery提供一个clone方法,专门用于处理dom的克隆: .clone()方法深度 复制所有匹配的元素集合,包括所有匹配元素.匹配元素的下级元素.文字节点. clon ...

  5. 深入理解DOM事件类型系列第五篇——文本事件

    × 目录 [1]change [2]textInput [3]input[4]propertychange[5]兼容 前面的话 如果DOM结构发生变化,触发的是变动事件:如果文本框中的文本发生变化,触 ...

  6. 深入理解DOM事件机制系列第四篇——事件模拟

    × 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...

  7. 深入理解DOM事件类型系列第三篇——变动事件

    × 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...

  8. 深入理解DOM事件类型系列第二篇——键盘事件

    × 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...

  9. 深入理解DOM事件类型系列第一篇——鼠标事件

    × 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...

随机推荐

  1. SqlServer与MySql语法比较

    1.复制表(包括表结构.表数据) SqlServer: Select * into user_copy from user MySql: CREATE TABLE user_copy LIKE use ...

  2. 图像检索中为什么仍用BOW和LSH

    原文链接:http://blog.csdn.net/jwh_bupt/article/details/27713453 去年年底的时候在一篇博客中,用ANN的框架解释了BOW模型[1],并与LSH[2 ...

  3. 2018秋招blibli算法工程师

    我给出代码如下:和之前做数塔(dp的入门题目)的思路一致 dp[i][j]为走到坐标(i,j)的最小减速(只有向右走和向上走两种情况) #include<stdio.h> #include ...

  4. day27-1 numpy模块

    目录 numpy array 一维数组 二维数组(用的最多) np.array和list的区别 获取多维数组的行和列 多维数组的索引 高级功能 多维数组的元素替换 多维数组的合并 通过函数方法创建多维 ...

  5. javascript 富文本 注意事项

    富文本编辑器 div内嵌iframe iframe body contenteditable属性 true 整个iframe 即为可编辑框,创建时注意事项: 1.编辑 焦点问题 弹出新控件时为控件设置 ...

  6. js操作url参数

    function getQueStr(url, ref) //获取参数值 { var str = url.substr(url.indexOf('?') + 1); if (str.indexOf(' ...

  7. Python中图像的缩放 resize()函数的应用

    cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst 参数说明: src - 原图 dst - 目标图像.当参数ds ...

  8. yii AR 模式操作

    Bat::find() ; //返回查询实例 Bat::find()->one() //返回一条数据 Bat::find()->all(); //返回所有数据 Bat::find()-&g ...

  9. rabbitMQ学习笔记(七) RPC 远程过程调用

    关于RPC的介绍请参考百度百科里的关于RPC的介绍:http://baike.baidu.com/view/32726.htm#sub32726 现在来看看Rabbitmq中RPC吧!RPC的工作示意 ...

  10. 洛谷 P1270 “访问”美术馆(树形DP)

    P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...