事件处理程序
关键点事件处理程序对于复杂的逻辑,主要是用来改变状态变量,通过状态变量来触发逻辑。
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绑定事件只能绑定一个事件处理函数?
因为事件处理函数被添加到下节点的属性值中。因此添加多个事件处理函数会被覆盖。
