事件处理程序
在DOM中定义了一些事件, 而响应某个事件的函数就叫事件处理程序(或事件侦听器)。事件处理程序的名字一般以on开头,例如:onclick等。
事件冒泡与捕获
事件流指的是页面中接收事件的顺序,IE,火狐和chrome浏览器都是事件冒泡,所谓是事件冒泡指的是事件最开始由最具体的元素接收,然后逐级向上传播到不具体的节点。而事件捕获则正好相反,事件捕获是由Netscape提出的,事件冒泡和捕获具体如下图所示:
 )
)
虽然事件捕获是Netscape唯一支持的事件流模型,但目前IE9,火狐和谷歌也都支持这种事件流模型。
事件冒泡的好处
因为事件具有冒泡机制,因此我们可以利用冒泡的原理,把事件加到父级上,触发执行效果。这样做的好处当然就是提高性能了。
| 1 | <head lang="en"> | 
这样我们就可以做到li上面添加鼠标事件。但是如果说我们可能有很多个li用for循环的话就比较影响性能。
下面我们可以用事件委托的方式来实现这样的效果。html不变:
| 1 | <script type="text/javascript"> | 
那么,如何阻止事件的冒泡呢,看下面一个例子:
| 1 | <div onclick="showMsg(this,event)" id="outSide" style="width:100px; height:100px; background:#000; padding:50px"> | 
DOM 0级事件处理程序
通过js指定事件处理程序通常是将回调函数赋给这个事件处理程序的属性。每个元素都有自己的事件处理程序属性(属性小写,例如:onclick)
| 1 | btn.onclick = function(){ | 
使用DOM 0级指定的事件处理程序被认为是元素的方法。因此,this指向当前元素:
| 1 | var btn = document.getElementById('myDiv'); | 
DOM 2级事件处理程序
DOM 2级定义了两个方法,用于指定和删除事件处理程序的操作:addEventListener()和removeEventListener(),他们都接受三个参数:
| 1 | 1.事件名,事件名不用加on,比如click、mouseover | 
IE中的事件处理程序
IE9之前的IE浏览器不支持addEventListener()和removeEventListener()。
与其他浏览器不同的是,IE使用的是attachEvent()和detachEvent()方法来为DOM添加事件处理程序,由于IE8及更早版本只支持事件冒泡,所以他们只接受两个参数:
| 1 | 1、事件处理程序名称(前面要加on) | 
值得注意的是,使用attachEvent()方法的情况下,事件处理程序会在全局作用域中运行,所以,此时this等于window。
事件对象
在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件相关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息。event对象会被作为第一个参数传递给事件监听的回调函数。我们可以通过这个event对象来获取到大量当前事件相关的信息:
| 1 | type (String) — 事件的名称 | 
此外,事件对象还可能拥有很多其他的属性,但是他们都是针对特定的event的。比如,鼠标事件包含clientX和clientY属性来表明鼠标在当前视窗的位置。
另外,stopPropagation()方法用于立即停止事件在DOM中的传播,即取消进一步的事件冒泡或捕获。
| 1 | var btn = document.getElementById('myDiv'); | 
只有在事件处理程序执行期间,event对象才会存在,一旦事件处理程序执行完毕,event对象就会自动销毁。
IE中的事件对象
在DOM 0级中添加事件处理程序时,event对象是作为window对象的一个属性存在的:
| 1 | var btn = document.getElementById('myDiv'); | 
IE 的event对象同样也包含与创建它的事件相关的属性和方法。
| 1 | cancleBubble 布尔 默认值时false,但可以被设置成true来取消事件冒泡,与dom中的 stopPropagation()方法相同。 | 
click事件
当用户点击以后,event对象会包含以下属性。
| 1 | pageX,pageY:点击位置相对于html元素的坐标,单位为像素。 | 
clientX,clientY
clientX和clientY,他们的值表示事件发生时鼠标指针在视口中的水平和垂直坐标(不包含滚动条区域)。
偏移量
| 1 | 通过以下4个属性可以取得元素的偏移量。 | 
pageX,pageY
这两个属性表示鼠标光标在页面中的位置,在页面没有滚动的情况下,pageX,pageY的值与clientX,clientY的值相等。
滚动大小
滚动大小,指的是包含滚动内容的元素的大小。
| 1 | 以下是4个与滚动大小相关的属性。 | 
焦点事件
焦点事件会在页面元素获得或失去焦点时触发,有以下4个焦点事件:
| 1 | 1. blur:元素失去焦点时触发,该事件不冒泡 | 
鼠标事件
DOM 3级定义了9个鼠标事件:
| 1 | click:当用户点击鼠标主键通常是指鼠标左键或按回车键时触发。 | 
 页面上的所有元素都支持鼠标事件。除了mouseenter和mouseleave外,所有的事件都冒泡,并且他们的默认行为是可以被取消掉的。但取消鼠标事件的默认行为可能会影响到其他事件,因为有些鼠标事件是相互依赖的。
mouseenter和mouseover的不同:
http://www.w3school.com.cn/tiy/t.asp?f=jquery_event_mouseenter_mouseover
拖拉事件
(1)drag事件
| 1 | 
 | 
(2)dragstart,dragend事件
| 1 | dragstart事件在用户开始用鼠标拖拉某个对象时触发,dragend事件在结束拖拉时触发。 | 
(3)dragenter,dragleave事件
| 1 | 
 | 
(4)dragover事件
| 1 | dragover事件在源对象拖拉过另一个对象上方时,在后者上触发。 | 
(5)drop事件
| 1 | 当源对象被拖拉到目标对象上方,用户松开鼠标时,在目标对象上触发drop事件。 |