NativeJS随记 - 浅析JavaScript Events

[size=x-large][color=indigo][b]Event Flow[/b][/color][/size]
为了能够更加直观的来了解事件的运作的整个流程,我们先来看看下面这个简单的HTML代码:

<html><body><div>My Div</div></body></html>

当我点击My Div的时候,会触发click事件,它的具体流程如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0114/4704/8ff490f1-ca56-3a81-aa6a-ee05ff52f413.jpg[/img]
从上图所示我们可以看出,当我们点击My Div时,首先触发的是Event Capturing Phase,自顶向下,依次经过html > body > div,最后到达指定目标对象,然后接下来它并没有到此停止,而是继续往上bubble,触发Event Bubbling Phase。所以,一个完整的事件流程为:Capturing Phase => Target Event => Bubbling Phase

[size=x-large][color=indigo][b]Event Types[/b][/color][/size]
从大的方向上来说,JavaScript的事件可以大致归类为一下几大类别:
[list]
[*]UI事件,例如focus, blur事件
[*]鼠标事件,例如mousedown, mouseup,click, dbclick
[*]键盘事件,例如keydown, keypress, keyup
[*]页面事件,例如load,unload
[*]表单事件,例如submit, select, change
[/list]

[size=x-large][color=indigo][b]Binding Events[/b][/color][/size]
一般来说,我们可以通过以下的三种方式来给DOM元素绑定特定的处理事件,每种方式各有利弊,具体如下所示:

[color=brown][size=medium][b][u]Traditional Event Binding[/u][/b][/size][/color]
最常见的,适用性最为广泛的是传统方式,或者也称之为DOM0的Event Binding方式,具体的展现方法如下代码所示:
window.onload = function (event) {
// event handling details
}

document.getElementById('id').onclick = function (event) {
// event handling details
}

[color=green][i][u]使用这种方法的好处如下:[/u][/i][/color]
- 适用性最为广泛,基本上所有的浏览器都支持这种方法
- 当使用这种方式绑定事件的时候,关键字this指向当前的操作元素,这对于后续的操作有很大的便利之处

[color=green][u][i]使用这种方法的弊端如下:[/i][/u][/color]
- 这种方法只能是适用于事件的Bubbling Phase,不能对Capturing Phase做任何的处理
- 这种方法所绑定的handler,对于IE浏览器,不会传递入event对象,想要获取IE下的event对象,必须通过window.event来获得
- 这种方法只能够绑定一个特定事件,当绑定多个事件的时候,后面的事件会覆盖掉前面的处理事件


[size=medium][color=brown][u][b]W3C Event Binding[/b][/u][/color][/size]
现代浏览器绝大部分都支持这种事件绑定的方法,具体的操作方式如下所示:
var myId = document.getElementById('id');
myId.addEventListener('click', myHandler, false);

function myHandler(event) {
alert('button was clicked!');
}

[color=green][i][u]使用这种方法的好处如下:[/u][/i][/color]
- 使用这种方法,可以针对Capturing/Bubbling Phase进来特定的事件绑定操作,addEventListener方法总共有三个参数,第一个参数是事件触发的类型,第二个是这对这个触发事件所要绑定的事件,第三个参数是一个布尔变量,false表示Bubbling Phase
- 使用这种方法可以针对某一个事件类型,绑定多以处理事件,而相互之间又不会互相影响
- 在绑定的处理方法中,关键字this指向现在当前的操作对象
- 你可以轻松获取到绑定方法的event对象,它被以第一个参数的形式带入到执行方法中

[color=green][u][i]使用这种方法的弊端如下:[/i][/u][/color]
- 不适用于旧版本的IE浏览器,对于旧版IE,需要使用attachEvent来进行事件的绑定,具体见下面小节所示


[size=medium][color=brown][b][u]Internet Event Binding[/u][/b][/color][/size]
var myId = document.getElementById('id');
myId.attachEvent('onclick', myHanlder);

function myHandler() {
alert('button was clicked!');
}

[color=green][i][u]使用这种方法的好处如下:[/u][/i][/color]
- 使用这种方法可以针对某一个事件类型,绑定多以处理事件,而相互之间又不会互相影响

[color=green][u][i]使用这种方法的弊端如下:[/i][/u][/color]
- 只适用于IE浏览器的操作
- 在绑定的处理事件中,关键字this,指向的是window对象
- 只能处理Bubbling Phase
- 想要获取event对象,必须通过window.event来获得

鉴于不同的浏览器有不同的具体实现,为了能够更好的操作事件,我们有必要开发一个辅助方法,来提供跨浏览器的支持,以下就是一个小小的Demo,仅供参考:
[img]http://dl2.iteye.com/upload/attachment/0114/4429/a67f44cf-24ce-3bcf-b37d-df674bf9f571.jpg[/img]
[img]http://dl2.iteye.com/upload/attachment/0114/4431/1ab3e09b-8e50-3cec-b799-b5db0df589ca.jpg[/img]
[img]http://dl2.iteye.com/upload/attachment/0114/4433/4626760e-2ffc-3178-a209-7d9b9e5390a1.jpg[/img]

[img]http://dl2.iteye.com/upload/attachment/0114/4427/74c0a850-4b44-3ec6-aeb1-cbf590f3a08a.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值