《Dom事件模型和事件委托》

158 阅读2分钟

Dom事件级别

  • Dom0---element.onclick=function(){}
  • Dom2---element.addEventLister('click',funtion(){},'false')---true表示事件捕获,false表示事件冒泡
  • Dom3---element.addEventListener('keyup,'function(){},'false')---Dom3其实是Dom2的基础上增加了一些事件,比如鼠标事件等,其实用法和Dom2相同

事件模型

  • 捕获 --- 从window元素开始发生,一直到目标元素 (首先)
  • 冒泡 --- 从目标元素开始发生,一直到window元素 (然后)
  • 有监听函数就调用,并提供事件信息,没有就跳过
  • Html标签需要通过document.documentElemnet来进行获取

疑问:那岂不是都调用两次?

答:其实不然,开发者可以自己选择把fn放在捕获阶段或者冒泡阶段(true(捕获)/falsy(冒泡))

事件流

什么是事件流:就是在页面点击鼠标右键,这个右键如何反对应到页面上,这就是事件流。

## Dom事件捕获/冒泡的具体流程

捕获:---window--document--html--body--...--目标元素

冒泡:反向

target和currenttargrt的区别

  • e.target 用户操作的元素
  • e.currenttarget 程序员监听的元素
  • this是e.currentturget

举例

div>span{文字} 用户点击文字

span就是用户操作的元素 e.target

e.currenttarget就是div

特例:只有一个div被监听时(不考虑父子同时被监听)fn分别在捕获阶段和冒泡阶段监听click事件,用户点击元素就是开发者监听的

代码:

div.addEventLisenter('click',f1)

div.addEventLisenter('click',f2,true)

谁先监听谁先执行!!!

事件的特性

  • e.stopPropagation() 取消冒泡
  • Bubbles表示是否冒泡
  • Cancelable 表示是否支持开发者取消冒泡(如scroll不支持取消冒泡)
  • 禁用滚动(取消特定元素的wheel和touchstart的默认动作)

自定义事件

`var eve = new Event('costome') //注册事件

dom.addEventlistener('custome',function{

//绑定事件名称

console.log('我是自定义事件')

dom.dispatchEvent(eve) //通过dispatchEver

}) `

事件委托

事件委托,就是把事件委托给别的元素。不直接监听目标元素,而是监听目标元素的父级元素甚至更外层元素,把监听元素委托给父级元素甚至更外层元素,然后判断被点击的元素或他的子孙元素是不是目标元素,如果是就调用函数,不是就是跳过。