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里的事件委托:当事件触发时,把想做的事情委托给父元素处理
如果要监听不存在的元素的点击事件。监听祖先,等点击的时候看看是不是我想要监听的元素即可。
事件委托的优点
- 节约监听数量(内存)
- 可以监听动态生成的元素
ps:最近赶上国庆,有点懈怠,又忙着做项目,好久没更新了,接下来恢复正常,争取每周更新自己的博客,继续加油吧