DOM2级事件的核心运行机制

2020-08-28  本文已影响0人  江平路
image.png

1、DOM0 事件绑定

box.onclick = function () {
    console.log('哈哈哈~~');
}
box.onclick = function () {
    console.log('呵呵呵~~');
} 
复制代码

只输出后面的:


image.png
box.onclick = function () {
    console.log('哈哈哈~~');
    //=>移除事件绑定:DOM0直接赋值为null即可
    box.onclick = null;
}
复制代码

2、DOM2 事件绑定

box.addEventListener('click', function () {
    console.log('哈哈哈~~');
}, false);
box.addEventListener('click', function () {
    console.log('呵呵呵~~');
}, false);
复制代码

两个都能输出:

image.png
function fn1(){ console.log(1); }
function fn2(){ console.log(2); }
function fn3(){ console.log(3); }
box.addEventListener('click', fn2, false); 
box.addEventListener('click', fn3, false); 
box.addEventListener('click', fn1, false); 
//=>基于addEventListener向事件池增加方法,存在去重的机制 “同一个元素,同一个事件类型,在事件池中只能存储一遍这个方法,不能重复存储”
box.addEventListener('click', fn1, false); // 所以此步跳过,不再存储
box.addEventListener('mouseover', fn1, false); 
image.png
function fn() {
    console.log('哈哈哈~~');
    //=>移除事件绑定:从事件池中移除,所以需要指定好事件类型、方法等信息(要和绑定的时候一样才可以移除)
    box.removeEventListener('click', fn, false);
}
box.addEventListener('click', fn, false); 

3、特别注意的几点

box.addEventListener('click', function () {
    console.log('哔咔哔咔~~');
});
box.onclick = function () {
    console.log('哇咔咔~~');
}
box.addEventListener('click', function () {
    console.log('call~~');
});

image.png
box.style.transition = 'opacity 1s';
box.ontransitionend = function () {
    console.log('哇咔咔~~');
}

box.addEventListener('transitionend', function () {
    console.log('哇咔咔~~');
}); 

window.addEventListener('load', function () {
    //=>所有资源都加载完成触发
    console.log('LOAD');
});
window.addEventListener('DOMContentLoaded', function () {
    //=>只要DOM结构加载完就会触发
    console.log('DOMContentLoaded');
}); 

//=>$(document).ready(function(){})
$(function () {
    //=>JQ中的这个处理(DOM结构加载完触发)采用的就是DOMContentLoaded事件,并且依托DOM2事件绑定来处理,所以同一个页面中,此操作可以被使用多次
});
/* JQ中的事件绑定采用的都是DOM2事件绑定,例如:on/off/one */
复制代码

4、window.onload$(document).ready()的区别

5、DOM0 和 DOM2 的传播的区别

浏览器常用的事件行为

image.png

1、鼠标事件

鼠标点击:鼠标按下弹起算一次点击

鼠标按下:不分左右键或者滚轮,只要按下/抬起就会触发

鼠标滚动

鼠标移动:鼠标尖端移动触发

鼠标经过

鼠标进入

思考:onmouseover 和 onmouseenter 的区别

image.png

如何选用:项目中,如果一个容器中有后代元素,想要鼠标进入和离开做啥事,我们一般都用mouseenter和mouseleave。

image.png

2、键盘事件

能绑定键盘事件的有:inputtextareawindowdocument.body

  • 如果想给不能编辑的元素绑定键盘事件,需要给这个元素加一个:contenteditable = "true"

3、表单事件

使用范围:input ......

4、音视频事件

使用范围:音频、视频

5、系统事件

其它常用事件

6、移动端事件

单手指事件模型 Touch

多手指事件模型 Gesture

7、其他事件

事件行为还有很多,这里我们暂时列举这些;更多的内容可以参考 MDN,事件参考; 或者可以查看元素的属性(属性中onxxx就是元素拥有的事件行为)

链接:https://juejin.im/post/6844904144587718664

上一篇下一篇

猜你喜欢

热点阅读