DOM事件和事件委托

260 阅读3分钟

DOM事件模型

DOM事件

DOM事件包括100多种,包括点击事件等。这些事件可以事件捕获和事件冒泡,事件捕获的特点是从外到内监听函数,即从父亲到儿子;事件冒泡的特点是从内到外监听函数,即从儿子到父亲。程序员可以决定使用事件捕获还是事件冒泡。

事件绑定API

IE5:baba.attachEvent('onclick',fn)//冒泡
网景:baba.addEventListener('click',fn)//捕获
W3C:baba.addEventListener('click',fn,bool)

在W3C标准中,如果bool不传或者为falsy,就让fn走冒泡,即当浏览器在冒泡阶段发现baba有fn监听函数,就会调用fn,并提供事件信息,如果bool为true,就让fn走捕获,即当浏览器在捕获阶段发现baba有fn监听函数,就会调用fn,并提供事件信息。

取消冒泡

  • 捕获不可取消,但冒泡可以
  • e.stopPropagation()可中断冒泡,浏览器不再向上走,一般用于封装某些独立的组件

不可取消冒泡

  • 有些事件不可取消冒泡
  • MDN搜索scroll event,看到Bubbles和Cancelable
  • Bubbles的意思是该事件是否冒泡
  • Cancelable的意思是开发者是否可以取消冒泡
  • 推荐看mdn英文版,中文版内容不全

阻止默认行为

  • DOM中提供preventDefault()方法来取消事件默认行为,但是只有当cancelable属性设置为true的事件,才可以使用preventDefault()来取消事件默认行为,使用event对象在事件函数中调用就行。

  • IE中提供的是returnValue属性,默认为true,当它设置为false时,就是取消事件默认行为,也是用event对象在事件函数中调用。

  • jQuery中提供了preventDefault()方法来阻止元素的默认行为,只需要用event对象来调用就好,即event.preventDefault()

  • 对于a链接,可以使用javascript伪协议来阻止默认行为

如何阻止滚动

Scroll事件不可取消冒泡 阻止Scroll默认动作没有用,因先有滚动才有滚动事件

如何阻止滚动 要阻止滚动,可阻止wheel和touchStart的默认动作

注意你需要找准滚动条所在的元素,但是滚动条还能用,可用CSS滚动条display:none

CSS也行 使用overflow:hidden可以直接取消滚动条,但此时JS依然可以修改ScrollTop

代码:CSS
::-webkit-scrollbar{width:0;important}

代码:JavaScript:
x.addEventListener('wheel',(e)=>{e.preventDefault()})
x.addEventListener('touch start',(e)=>{e.preventDefault()})

事件委托

事件委托就是把事件监听放在祖先元素(如父元素,爷爷元素)上。

JS里的事件委托:当事件触发时,把想做的事情委托给父元素处理

如果要监听不存在的元素的点击事件。监听祖先,等点击的时候看看是不是我想要监听的元素即可。

事件委托的优点

  1. 节约监听数量(内存)
  2. 可以监听动态生成的元素

ps:最近赶上国庆,有点懈怠,又忙着做项目,好久没更新了,接下来恢复正常,争取每周更新自己的博客,继续加油吧