浅谈dom事件

第三篇博客,又来了一个深奥的问题DOM
DOM事件,可以说是DOM模型中一个重中之重的问题。
众多的click,touch,mouseover…..等等都是dom事件的一部分,但是他们是怎么执行的呢,执行的顺序又是什么。
这里就要说第一个概念DOM事件级别,DOM0,DOM2,DOM3.(有的童鞋会问了,为什么没有DOM1?1级DOM标准中并没有定义事件相关的内容,所以没有所谓的1级DOM事件模型,所有没有所谓的DOM1事件)。下面来看三种代码

DOM0 :  element.onclick=function(){}
DOM2 :  element.addEventListener('click',function(){},false)
DOM3 :  element.addEventListener('keyup',function(){},false)

DOM2和DOM3的主要区别是:DOM3在DOM2的基础上加了很多新的事件, 而且DOM3的事件名字基本都用了“驼峰”写法, 区别不是非常大。

Internet Explorer 8 及更早IE版本不支持 addEventListener() 方法,,Opera 7.0 及 Opera 更早版本也不支持。 但是,对于这些不支持该函数的浏览器,你可以使用 attachEvent() 方法来添加事件

addEventListener(,,false)中的false是指事件冒泡或者事件捕获下面会讲到。

然而dom级别只有这么多内容,他是怎么一步步获取的呢,这里就引入了一个概念dom事件模型,事件捕获和事件冒泡,举个栗子你们吃了就明白了:

比如说有一个button按钮,你可以把它看成一条鱼,事件捕获就是撒下一个大网 ,然后网慢慢缩小来捕这条鱼,所以他是从上到下从父元素到子元素依次寻找事件,而事件冒泡恰恰相反,就是这个鱼吐了个泡泡,这个泡泡离水面越近就越大,就变成了事件冒泡。

从dom事件模型也大概可以看出另一个概念 dom事件流,但是能一五一十一字不落的描述dom事件流的人大概寥寥无几吧,首先dom事件流的三个阶段,事件捕获→目标阶段→事件冒泡,具体是怎么发生的呢?
事件捕获的开头到底是什么,有人说是body,还有人说是html,仔细考虑一下,这不仅仅只是依靠html文档上,它主要是由浏览器获取你的点击,键盘等,所以他的开头是window,然后下一步就是document也就是html,接下来就跟你们想的一样从body->…..到目标然后事件冒泡再回到window。

那么说道window又一个问题出现了,浏览器是如何获取你的点击事件呢?答案就是event,事件的状态。
那么你们对

 event.preventDefault()
 event.stopPropagation()
 event.stopImmediatePropagation()
 event.currenttarget()
 event.target()

了解多少呢?

event.preventDefault(),这个大概了解的可能多一下,阻止默认行文,比如说a标签默认的href跳转等等

event.stopPropagation(),这个用到的可能也是比较多,这就是阻止事件冒泡的写法,如果你不想子元素的事件再冒泡到父元素,最好加上这句代码。

下面难题来了 event.stopImmediatePropagation() 很多人 ???excuse me?what's this?没见过啊,没关系我告诉你。你假设一个button绑定了a事件,b事件,c事件。那这里写代码片么你点击button之后a.b.c会依次执行,那么你想让a执行完之后不执行b,c怎么办呢?答案就是在a事件中加入event.stopImmediatePropagation() 这一句代码

event.currenttarget()
event.target(),这两个看起来很相似对吧,其实他们区别在一个概念,事件委托or事件注册?什么 你不知道?
好吧,如果说有一个2000行的ul列表,你想给每个li添加相同的事件,你如果用循环for…给每个li就太慢了吧,这时候你就需要事件委托,将子元素事件委托给父元素,所以event.currenttarget就是事件所绑定的元素,event.target就是事件所执行的元素。

好了其实到这里,DOM事件就说的差不多了,如果本文有错请指正
QQ1817169988
微信15562997968 (老哥们不要电话轰炸我还是个孩子)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章