DOM-事件
最后更新于 2016-05-23 12:18:00
JavaScript 的作用就是让 html 静态页面具备动态效果,而这些基本都是利用 DOM 事件来实现的。
注册 DOM 事件
事件就是给目标 DOM 节点提前注册一个相应类型的事件方法,在合适的时机进行回调执行该方法的过程。接下来就来看看如何给目标 DOM 节点注册事件:
<style>
div {
background-color: #ccc;
margin-bottom: 20px;
}
</style>
<body>
<!-- 第一种:内联(html)事件 -->
<div onclick="alert(-1)">这是个内联事件</div>
<div id="event0">这是个0级DOM事件</div>
<div id="event2">这是个2级DOM事件</div>
</body>
<script>
// 第二种:属性(0级DOM)事件
var div_obj0 = document.querySelector("#event0");
div_obj0.onclick = function(){
alert(0);
}
// 第三种:2级DOM事件(addEventListener 方法)
var div_obj2 = document.querySelector("#event2");
div_obj2.addEventListener("click", function(){
alert(1);
}, false);
</script>
以上示例可以看出,我们有三种定义事件的方式:内联(html)事件、属性(0 级 DOM)事件、2 级 DOM 事件。事实上,前两者的本质是一样的,都是内联属性事件;我们通常都是通过第三种方式来(2 级 DOM 事件)定义事件的,它可以将同种事件定义多次而不会覆盖。
我们在这里通过三种方式定义了三个事件,但它们都属于 click
(鼠标左键点击)类型的事件,这只是其中一种事件类型,更多的事件类型我们不在这里进行一一列举。
事件流程
如果我们给一个元素节点和它的子节 点均定义了相同类型(例如 click)的事件,当子节点的事件触发时,那么它的父元素事实上也满足了事件触发条件,但是它们的先后顺序是怎样的?这时候对于整个 HTML 文档(DOM 树)来说就有一个事件流程的概念。
<style>
div {
height: 200px;
background-color: #ccc;
}
<style>
<body>
<div>body是html的子节点,该div又是body的子节点</div>
</body>
<script>
// 事件捕获阶段
document.documentElement.addEventListener('click', function(){
console.info("1:捕获目标中");
}, true);
document.body.addEventListener('click', function(){
console.info("2:捕获目标中");
}, true);
// 目标div
document.querySelector('div').addEventListener('click', function(){
console.info("3:找到目标div");
}, false);
// 事件冒泡阶段
document.body.addEventListener('click', function(){
console.info("4:事件冒泡中");
}, false);
document.documentElement.addEventListener('click', function(){
console.info("5:事件冒泡中");
}, false);
</script>
以上示例中,当我们用鼠标左键点击 DIV 时,控制台上会依次出现这五句话,而这正展示了 DOM 事件流程中的一部分,但足以说明事件流程这个概念。
当我们触发了某个 DOM 节点上的事件时,浏览器会从 DOM 树的根部开始遍历(捕获)到目标节点,待找到目标节点后触发事件,之后又反向遍历(冒泡)到 DOM 树的根节点。这也就是 DOM 事件流程:
捕获 -> 目标触发事件 -> 冒泡
在捕获与冒泡过程中,若路过(遍历)的节点上定义的事件与目标节点上触发的事件类型相同的话也会被触发。
addEventListener()
方法的第三个参数是个布尔值:**true 则表示事件在捕获阶段触发,false 则表示事件在冒泡阶段触发。**我们通常让事件在冒泡阶段触发。