DOM事件
DOM level 0:
onclick = “要执行的代码” //一旦用户点击,浏览器就eval(“要执行的代码”)
例:
<script>
function print(){console.log(''hi)}
</script>
<button id = X onclick = "print()">
<script>
X.onclick = print //类型为函数对象,对
Y.onclick = print() //undefined,错
</script>
DOM level 1:同DOM level0;
DOM level 2:
X.addEventListener('click',function(){}) //队列,先进先出,先绑定先触发
与 X.onclick = function(){}区别:
这是一个属性,是唯一的,只能绑定一个onclick;
一次事件监听 X.one(‘click’,fn(){}) //添加后移除事件
X.removeddEventListener('click',function(){})
祖先元素绑定事件模型:
<div id="grand1">
爷爷
<div id="parent">
爸爸
<div id="child1">儿子</div>
</div>
</div>
<script>
grand1.addEventListener('click',function f1(){
console.log('爷爷')
})
parent1.addEventListener('click',function f2(){
console.log('父亲')
})
child1.addEventListener('click',function f3(){
console.log('儿子')
})
</script>
- 当我点击儿子时,也相当于点击父亲和爷爷
- 当我点击儿子时,也相执行其绑定事件,执行f1 f2 f3;
X.addEventListener(‘click’,function f1(){},参数)
添加参数,默认是false
假如是false:从小到大(冒泡) f3 f2 f1 ,假如是true:从大到小(捕获) f1 f2 f3假如同一个事件本身存在冒泡捕获,那么按照写的顺序执行
X.addEventListener(‘click’,function f1(){},false) //冒泡
X.addEventListener(‘click’,function f1(){},ture) //捕获
阻止祖先DOM事件触发
点击其他地方关闭浮层
方案1:
通过stopPropagation()方法阻止事件传播;
代码如下:
预览:
https://roxas332519096.github.io/notes-demo/0528-点击其他地方关闭浮层方案1.html
<script>
clickMe.addEventListener('click',function(e){
popover.style.display = 'block';
})
wrapper.addEventListener('click',function(e){
e.stopPropagation();
})
document.addEventListener('click',function(e){
popover.style.display = 'none';
})
</script>
方案2:
用jQuery的监听一次事件one()与setTimeout()
预览:
https://roxas332519096.github.io/notes-demo/0528-点击其他地方关闭浮层方案2.html
代码如下:
<script>
$(clickMe).on('click',function(){
$(popover).show();
setTimeout(function(){
$(document).one('click',function(){
$(popover).hide();
})
},0)
})
</script>
做一个Demo理解DOM事件:
预览:
https://roxas332519096.github.io/notes-demo/0528-理解DOM事件DEOM.html
过程:
第一次点击时,先事件监听最后的参数为true,所以传播方式为捕获,从父元素到子元素传播;
其后,事件监听最后的参数为默认值,false,所以传播方式为冒泡,从子元素到父元素上传播;
代码如下:
<script>
let divs = $('div').get()
let n = 0
for (let i = 0; i < divs.length; i++) {
divs[i].addEventListener('click', () => {
setTimeout(() => {
divs[i].classList.add('active')
}, n * 500)
n += 1
}, true)
}
for (let i = 0; i < divs.length; i++) {
divs[i].addEventListener('click', () => {
setTimeout(() => {
divs[i].classList.remove('active')
}, n * 500)
n += 1
})
}
</script>
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Roxas Deng的博客!