事件处理程序
关键点事件处理程序对于复杂的逻辑,主要是用来改变状态变量,通过状态变量来触发逻辑。
HTML绑定事件处理程序
- 最古老的事件绑定方式,通过HTML标签的属性来绑定事件处理程序,兼容性很好。但是违背了HTML和javascript结构与行为分离的原则。但需要修改代码时,需要修改两处,尽量少使用。 - <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- <style>
- .box1 {
- height: 100px;
- width: 100px;
- background-color: pink;
- }
- .box2 {
- height: 50px;
- width: 50px;
- background-color: red;
- position: relative;
- top: 0;
- left: 25px;
- }
- </style>
- </head>
- <body>
- <div class="box1" onclick="console.log('我是盒子1');">
- <span>盒子1</span>
- <div class="box2" onclick="console.log('我是盒子2');">
- <span>盒子2</span>
- </div>
- </div>
- </body>
- </html>
 - DOM0绑定事件处理程序- 缺点同一个事件源没法绑定多个事件句柄,会被覆盖。 - <body> <div class="box1"> <span>盒子1</span> <div class="box2"> <span>盒子2</span> </div> </div> </body> <script> let box1 = document.getElementsByClassName('box1')[0]; box1.onclick = () => {console.log('我是盒子1')}; //开始支持javascript绑定元素的事件处理程序。 box1.onclick = () => {console.log('我才是盒子1')}; //当绑定同一事件时,后一个事件会被前一个事件覆盖。 box1.onclick = null; //删除事件 </script>
DOM2绑定事件处理程序重要
- addEventListener()
- removeEventListener() - <script> let box1 = document.getElementsByClassName('box1')[0]; box1.addEventListener('click', () => console.log('我是盒子1'), false); let box2 = document.getElementsByClassName('box2')[0]; box2.addEventListener('click', remove); //默认值参数是false box2.addEventListener('click', remove); //绑定相同的函数只会执行一次。绑定多个函数需要不同的函数。 /** *目的:移除事件removeEventListener() *参数:参数同addEventListener()一样 *功能:将增加的事件移除 *返回值:无 *总结:参数是匿名函数、函数定义都不起作用的 */ box1.removeEventListener('click', () => console.log('我是盒子1'), false); //handler是匿名函数没有作用 console.log(box2.removeEventListener('click', remove)) //起作用。但是remove换成函数定义也没用。 function remove() { console.log('我是盒子2') } </script>- IE事件处理程序了解
- 绑定事件处理程序的方法,只在IE浏览器可以使用。 ```javascript /* 目的:对比与DOM2Event的区别 */ var box1 = document.getElementById(‘dd’); 
function remove1() { console.log(‘我是盒子1’) } box1.attachEvent(‘onclick’, remove1); //第一个参数是onclick,比DOM2Event多了个on box1.attachEvent(‘onclick’, function remove2() { console.log(‘我是盒子1的兄弟’)}); //同一元素也可以添加多个事件 box.detachEvent(‘onclick’, remove); //移除事件,方法和DOM2Event一样
---
<a name="LFMJD"></a>
# 深入理解HTML绑定事件处理程序
```html
 <div class="box1" onclick="console.log(textContent);">
- 元素节点下的onclick属性值,封装在onclick包装函数里。
- onclick包装函数,具体的定义。with关键字将一个对象的引用作为作用域。 - //with作用的就是扩展了函数内变量的作用域链 function onclick(enent){ with(document){ with(this){ console.log(textContent); } } }
- 因为包装函数,使得事件处理函数可以方便的访问自己的属性。 
为什么HTML和DOM0绑定事件只能绑定一个事件处理函数?
因为事件处理函数被添加到下节点的属性值中。因此添加多个事件处理函数会被覆盖。
 
 
                         
                                

