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 => evvar eve = new Event('test');ev.addEventListener('test', function () {console.log('test dispatch');});setTimeout(function () {ev.dispatchEvent(eve); // ev.dispatchEvent('事件对象') 注意不是绑定的事件名称}, 1000);</script></body></html>
