深度理解DOM事件(实例)
前言
通过如下两个实例来理解DOM事件
- 实例1--点击别处关闭浮层
onclick与addEventListener的区别
- 实例2--点击后颜色一层一个层出现的漂亮的彩虹圈
1 实例1--点击别处关闭浮层
- 代码效果演示:原生JS 、 jQuery
- 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)
- addEventListener:很多浏览器支持addEventListener(IE9、IE10、IE11、chrome、firefox、opera、safari支持),使用方式如下:
- attachEvent:IE中提供的类似addEventListener的事件监听器,使用方式如下:
//qqq
var target = document.getElementById("test");
target.attachEvent('onclick',test);
function test(){
console.log("Hi");
}
- attachEvent:IE中提供的类似addEventListener的事件监听器,使用方式如下:
- 理论上,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
- 理论上,Event Listeners (addEventListener and IE's attachEvent)可以无限增加事件监听给某个一元素。实际应用的约束就是客户端内存的限制,这一点因每个浏览器而异
- Inline events (“HTML onclick="" property” and “element.onclick”)
- 使用方式:
- onclick=""
<a id="test" href="#" onclick="function()">clickMe</a>
- onclick=""
- element.onclick
<a id="test" href="#">clickMe</a> var target = document.getElementById('test')
target.onclick = function(){
console.log('Hi');
}
- element.onclick
- Inline events只能添加一个事件,如果同时有多个,只会输出最后一个的结果
var target = document.getElementById('tttt')
target.onclick = function(){
console.log('Hi');
}
target.onclick = function(){
console.log('Hello');
}
//Hello
- Inline events只能添加一个事件,如果同时有多个,只会输出最后一个的结果
- 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事件(实例)的更多相关文章
- 理解DOM事件流的三个阶段
本文主要解决两个问题: 1.什么是事件流 2.DOM事件流的三个阶段 事件流之事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张 ...
- javascript:理解DOM事件
首先,此文不讨论繁琐细节,但是考虑到读者的心灵感受,本着以积极向上的心态,在此还是会列举示例说明. 标题为理解DOM事件,那么在此拿一个简单的点击事件为例,希望大家看到这个例子后能触类旁通. DOM ...
- 从click事件理解DOM事件流
事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这 ...
- 深度理解DOM拷贝clone()
克隆节点是DOM的常见操作,jQuery提供一个clone方法,专门用于处理dom的克隆: .clone()方法深度 复制所有匹配的元素集合,包括所有匹配元素.匹配元素的下级元素.文字节点. clon ...
- 深入理解DOM事件类型系列第五篇——文本事件
× 目录 [1]change [2]textInput [3]input[4]propertychange[5]兼容 前面的话 如果DOM结构发生变化,触发的是变动事件:如果文本框中的文本发生变化,触 ...
- 深入理解DOM事件机制系列第四篇——事件模拟
× 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...
- 深入理解DOM事件类型系列第三篇——变动事件
× 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...
- 深入理解DOM事件类型系列第二篇——键盘事件
× 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...
- 深入理解DOM事件类型系列第一篇——鼠标事件
× 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...
随机推荐
- fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能
用vue写的 显示,隐藏 hide(){ this.canvas.getActiveObject().set('opacity', 0).setCoords(); this.canvas.reques ...
- in 与 exist , not in 与 not exist
in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的. 如果查询的两个 ...
- sphinx with discuz
安装sphinx: sudo apt-get install sphinxsearch 配置: source discuz { type = mysql sql_host = xx.xx.xx.xx ...
- BigDecimal,注解
BigDecimal 问题重现 今天在干活的途中,发现一个很坑爹的问题,让我来复现下问题: 从上游接口获得的余额,对于为0的,做了判断 BigDecimal a = new BigDecimal(ac ...
- 图片无损放大软件PhotoZoom分屏预览功能 ,简直好用!
PhotoZoom是一款智能放大图片软件,很多用户在初次使用PhotoZoom,发现图片所处的区域上方有四个不同方式的预览选项.因为很多初学者使用时不明白这四个按钮有什么作用,所以小编接下来讲解一下P ...
- Linux的环境中如何生成srw-rw---- 的文件权限?
文件属性 d 开头是: 目录文件. l 开头是: 符号链接(指向另一个文件,类似于瘟下的快捷方式). s 开头是: 套接字文件(sock). b 开头是: 块设备文件,二进制文件. c 开头是: 字符 ...
- Project Euler 13 Large sum
题意:计算出以下一百个50位数的和的前十位数字. /************************************************************************* ...
- C# List源码分析(二)
常用操作的复杂度分析 Contains 该方法是一个O(n)的方法,是根据顺序依次遍历整个列表的,观看源码,跟JAVA还是有不少分别的,在上一篇中就有发现,因为C#对Primitive类型是有处理的, ...
- PHP面向对象(一)
1 面向对象介绍 1.1 介绍 面向对象是一个编思想. 编程思想有面向过程和面向对象. 面向过程: 编程思路集中的是过程上 面向对象: 编程思路集中在参与的对象 1.2 好处 多人合作方便 ...
- 【ACM-ICPC 2018 南京赛区网络预赛 I】Skr
[链接] 我是链接,点我呀:) [题意] 让你把一个字符串的所有回文子串加起来.(当做数字加起来) 求他们的和. [题解] 回文树. 从两个根节点分别遍历整棵回文树. 按照每个节点的定义. 得到每个节 ...