Javascript 事件总结(二)
2014-04-19 · 531 chars · 3 min read
前一篇文章,比较详细的讲了下 javascript 的事件流和事件处理程序,下面接着讨论 javascript 的事件对象和事件委托。
事件对象#
在触发 DOM 上的事件时,会产生一个事件对象 event。这个对象包含了所有和事件有关的信息(例如导致事件的元素,事件的类型等)。具体内容可以看W3School,下面讲一下兼容各种浏览器的事件对象:
1、获取 event 对象
function getEvent(event) {
return event ? event : window.event
}
2、获取事件目标
function getTarget(event) {
return event.target || event.srcElement
}
3、取消事件的默认行为
function preventDefault(event) {
if (event.preventDefault) {
event.preventDefault()
} else {
event.returnValue = false
}
}
4、阻止事件冒泡
function stopPropagation(event) {
if (event.stopPropagation) {
event.stopPropagation()
} else {
event.cancelBubble = true
}
}
使用方法举例:
var link = document.getElementById('link')
link.onclick = function (event) {
alert('link')
preventDefault(event)
}
事件委托#
事件处理程序过多的时候,会有几个问题:
- 每个事件处理函数都是对象,都会占内存,所以事件处理程序越多,性能越差。
- 必须事先指定所有的事件处理程序,事件处理程序越多,访问 DOM 的次数就越多,会延迟整个页面交互就绪的时间。
所以,建议使用事件委托来解决这些问题。事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理一类的事件。例如:
<ul>
<li><a id="a1" href="955">jQuery最佳实践<a></li>
<li><a id="a2" href="992">Handlebars.js 中文文档</a></li>
</ul>
我们想给上面的两个链接添加 click 事件,我们可以这么做:
document.onclick = function (e) {
e = e || window.event
var target = e.srcElement ? e.srcElement : e.target
switch (target.id) {
case 'a1':
//点击了a1
break
case 'a2':
//点击了a2
break
}
}
关于事件委托还有更“高端”应用,例如 bootstrap 等类库,直接在标签上加data-toggle 属性就可以开启控件,其原理也是事件委托。


