事件机制是 UI 编程
一个非常重要的特性,我们日常使用手机APP、桌面软件,点击了一个按钮的背后,就是触发了一个点击事件处理。JavaScript 的本质上也是一门 UI 编程语言
,所有内置了功能非常丰富的事件对象。
事件执行的两种方法。
<!-- 1. html 属性绑定事件 -->
<p onclick="alert('点击事件')">按钮</p>
<!-- 2. dom 绑定事件 -->
<script>
var p = document.getElementsByTagName('p')[0]
p.onclick = function(e) {
e // 当前事件对象,例如有些对象 "keydown" 按下键盘,可以通过 e 这个对象获取到 按键码,或者 "mousedown" 鼠标点击左键还是右键,“ mouseover” 当前光标坐标 ...
this // 代表了当前元素 "p"
}
</script>
常用的事件对象。
// click 点击
// load 加载
// focus 触发焦点
// blur 离开焦点
// change 改变
// submit 表单提交
// reset 表单重置
// resize 窗口大小改变
// mouseover 鼠标移入
// mouseout 鼠标移除
// scroll 滚动条
如果把上例 2. dom 绑定事件
称为 dom 0 事件
,那是 dom 2 事件
就是对它进行了一些 bug 的修复和增加了一个 捕获和冒泡
的功能。
简单的说,冒泡和捕获就是事件的触发流程
。
<!DOCTYPE html>
<html>
<head>
<title>事件冒泡</title>
</head>
<body>
<div>点击事件</div>
<script type="text/javascript">
/*
我们为 “body” 和 “div” 都绑定了事件对象,由于 “div” 是 “body” 的子元素,触发了 “div” 的同时,也会触发了 “body”,所有这两者的触发顺序模型,就是捕获和冒泡。
本例中,我们在 addEventListener 的第三个参数设置为 “false”,所以触发的是 “冒泡事件”,执行的顺序是先 “div” 后 “body”,从下级往上级 “冒”
捕获呢,则是反之,只需要把 “false” 修改成 “true”
*/
document.getElementsByTagName('body')[0].addEventListener('click', function() {
alert(this) // [object HTMLBodyElement]
}, false)
document.getElementsByTagName('div')[0].addEventListener('click', function() {
alert(this) // [object HTMLDivElement]
}, false)
</script>
</body>
</html>
移除事件
/*
DOM2 事件相比于 DOM0,还增加了移除事件的功能
还有一点区别,DOM0 的事件名称需要 + ‘on’
*/
// 绑定
window.addEventListener('click',f)
// 移除
window.removeEventListener('click', f)