DOM事件(DOM,BOM)
DOM事件类
基本概念:DOM事件的级别
DOM0 -
element.onclick=function(){}
DOM2 -element.addEventListener('click', function(){}, false/true)
// 第三个参数设置为 true 则在 捕获阶段触发
通过GIF理解 addEventListener,捕获和冒泡
DOM3 -element.addEventListener('keyup', function(){},false/true)
事件类型增加很多(鼠标事件,键盘事件)DOM事件模型
捕获从上往下,冒泡(目标元素/当前元素)从下往上- DOM事件流
浏览器在当前页面与用户做交互中,比如我点击了左键,这个左键怎么传到页面元素上的,目标元素是怎么响应的,这个就是事件流。
一个完整的事件流分为三个阶段:捕获 => 目标阶段 => 冒泡(事件通过捕获到达目标元素,这个阶段就是目标阶段,通过目标元素上传到 window 对象,这个就是冒泡阶段) - 描述DOM事件捕获的具体流程
window => document => html ( document.documentElement 可以拿到 HTML标签 ) => body => …(父级元素,子级元素,一层一层往下找) - Event对象的常见应用
event.preventDefault() // 阻止默认事件,比如我是一个 a 标签,组织链接跳转
event.stopPropagation() // 阻止冒泡
event.stopImmediatePropagation() // 一个标签绑定两个事件 a, b,通过优先级的方式,给 a 事件中设置此属性,则就会成功阻止到 b 事件的触发
event.currentTarget // 当前所绑定的事件,比如父级元素绑定的事件,就是此事件
event.target // 事件委托(事件代理,子元素事件全部绑定到父元素上) - 自定义事件 ```javascript var eve = new Event(‘custome’); ev.addEventListener(‘custome’, function(){ console.log(‘custome’); }); // ev 指的是绑定元素 ev.dispatchEvent(eve); // 触发
var eve = new CustomEvent(‘自定义事件名称’, 传参); // 与 Event 比较,此方法可以传参
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Event</title>
</head>
<body>
<div id="ev">
<style media="screen">
#ev{
width: 300px;
height: 100px;
background: red;
color: #fff;
text-align: center;
line-height: 100px;
}
</style>
目标元素
</div>
<script type="text/javascript">
var ev = document.getElementById('ev');
ev.addEventListener('click', function (e) {
console.log('ev captrue');
}, true); // 第三个参数,true 表示此事件是在捕获阶段触发
window.addEventListener('click', function (e) {
console.log('window captrue');
}, true);
document.addEventListener('click', function (e) {
console.log('document captrue');
}, true);
document.documentElement.addEventListener('click', function (e) {
console.log('html captrue');
}, true); // true 参数,html 元素
document.body.addEventListener('click', function (e) {
console.log('body captrue');
}, true);
// 以上事件的触发顺序:window => document => html => body => ev
var eve = new Event('test');
ev.addEventListener('test', function () {
console.log('test dispatch');
});
setTimeout(function () {
ev.dispatchEvent(eve); // ev.dispatchEvent('事件对象') 注意不是绑定的事件名称
}, 1000);
</script>
</body>
</html>