javascript高级程序设计第三版 第13章 事件

13.1 事件流

如果你单击了某个按钮,他们都认为单击事件不仅仅发生在按钮上。换句话说,在单击按钮的同时,你也单击了按钮的容器元素,甚至也单击了整个页面。

事件流描述的是从页面中接收事件的顺序。

13.1.1 事件冒泡

事件冒泡,即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。

IE9、Firefox、Chrome和Safari则将事件一直冒泡到window对象。

13.1.2 事件捕获

事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。事件捕获的用意在于在事件到达预定目标之前捕获它。

由于老版本的浏览器不支持,因此很少有人使用事件捕获。建议使用事件冒泡。

13.1.3 DOM事件流

“DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。

13.2 事件处理程序

事件就是用户或浏览器自身执行的某种动作。例如onclick
而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。

13.2.1 HTML事件处理程序

<input type="button" value="Click Me" onclick="alert('Clicked')" />

//通过event变量,可以直接访问事件对象
<input type="button" value="Click Me" onclick="alert(event.type)" />

//this值等于事件的目标元素
<input type="button" value="Click Me" onclick="alert(this.value)" />

13.2.2 DOM0级事件处理程序

var btn = document.getElementById("mtBtn");
btn.onclick = function(){
    alert(this.id);//"myBtn"
};

btn.onclick = null;//删除事件处理程序

13.2.3 DOM2级事件处理程序

addEventListener()和removeEventListener(),接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。这个布尔值为true,表示在捕获阶段调用事件处理程序;如果为false,表示在冒泡阶段调用事件处理程序。

var btn = document.getElementById("myBtn");
btn.addEventListener("click",function(){
    alert(this.id);
},false);

好处是可以添加多个事件处理程序,按添加顺序执行。
如果不是特别需要,不建议在事件捕获阶段注册事件处理程序。

13.2.4 IE事件处理程序

attachEvent()和detachEvent(),接受2个参数:要处理的事件名和作为事件处理程序的函数,只支持事件冒泡。

作用域不一样,attachEvent()方法的情况下,事件处理程序会在全局作用域中运行,this等于window。

13.2.5 跨浏览器的事件处理程序

略,用能力检测实现。

13.3 事件对象

在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息。

13.3.1 DOM中的事件对象

//在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。
var btn = document.getElementById("myBtn");
btn.onclick = function(event){
    alert(event.currentTarget === this);//true
    alert(event.target === this);//true
};
//按钮上没有注册事件处理程序,结果click事件就冒泡到了document.body
document.body.onclick = function(event){
    alert(event.currentTarget === document.body);//true
    alert(this === document.body);//true            
    alert(event.target === document.getElementById("myBtn"));//true
};

要阻止特定事件的默认行为,可以使用preventDefault()方法。例如,链接的默认行为就是在被单击时会导航到其href特性指定的URL。只有cancelable属性设置为true的事件,才可以使用preventDefault()来取消默认行为。

var link = document.getElementById("myLink");
link.onclick = function(event){
    event.preventDefault();
};

stopPropagation()方法用于立即停止事件在DOM层次中的传播,即取消进一步的捕获或冒泡。

var btn = document.getElementById("myBtn");
btn.onclick = function(event){
    alert("clicked");
    event.stopPropagation();
}; 

//点击按钮不会触发
document.body.onclick = function(event){
    alert("Body clicked");
};

事件对象的eventPhase属性,可以用来确定事件当前正位于事件流的哪个阶段。捕获为1,处于目标对象为2,冒泡为3。

13.3.2 IE中的事件对象

IE的event对象与DOM的event对象对应关系
cancelBubble对应 true时,对应DOM的stopPropagation()
returnValue对应 false时,对应DOM的preventDefault()
srcElement对应 event.target

13.3.3 跨浏览器的事件对象

13.4 事件类型

13.4.1 UI事件

1、load事件
2、unload事件
3、resize事件
4、scroll事件

13.4.2 焦点事件

focusin,focusout,focus,blur等。

13.4.3 鼠标与滚轮事件

click,dbclick,mousedown,mouseenter,mouseleave,mousemove,mouseout,mouseover,mouseup等

13.4.4 键盘与文本事件

keydown,keypress,keyup,textInput等

13.4.5 复合事件

13.4.6 变动事件

DOMNodeRemoved,DOMNodeInserted等

13.4.7 HTML5事件

contextmenu,beforeunload,DOMContentLoaded,readystatechange,pageshow,pagehide

13.4.8 设备事件

13.4.9 触摸与手势事件

13.5 内存和性能

13.5.1 事件委托

事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。只需在DOM树中尽量最高的层次上添加一个事件处理程序。

13.5.2 移除事件处理程序

每当将事件处理程序指定给元素时,运行中的浏览器代码与支持页面交互的JavaScript代码之间就会建立一个连接。这种连接越多,页面执行起来就越慢。在不需要的时候移除事件处理程序,也是解决这个问题的一种方案。

13.6 模拟事件

document.createEvent()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值