事件处理程序

关键点事件处理程序对于复杂的逻辑,主要是用来改变状态变量,通过状态变量来触发逻辑。

HTML绑定事件处理程序

  • 最古老的事件绑定方式,通过HTML标签的属性来绑定事件处理程序,兼容性很好。但是违背了HTML和javascript结构与行为分离的原则。但需要修改代码时,需要修改两处,尽量少使用。

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Document</title>
    8. <style>
    9. .box1 {
    10. height: 100px;
    11. width: 100px;
    12. background-color: pink;
    13. }
    14. .box2 {
    15. height: 50px;
    16. width: 50px;
    17. background-color: red;
    18. position: relative;
    19. top: 0;
    20. left: 25px;
    21. }
    22. </style>
    23. </head>
    24. <body>
    25. <div class="box1" onclick="console.log('我是盒子1');">
    26. <span>盒子1</span>
    27. <div class="box2" onclick="console.log('我是盒子2');">
    28. <span>盒子2</span>
    29. </div>
    30. </div>
    31. </body>
    32. </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);">
  1. 元素节点下的onclick属性值,封装在onclick包装函数里。
  2. onclick包装函数,具体的定义。with关键字将一个对象的引用作为作用域。

    //with作用的就是扩展了函数内变量的作用域链
    function onclick(enent){
     with(document){
       with(this){
         console.log(textContent);
     }
    }
    }
    
  3. 因为包装函数,使得事件处理函数可以方便的访问自己的属性。

image.png

为什么HTML和DOM0绑定事件只能绑定一个事件处理函数?

因为事件处理函数被添加到下节点的属性值中。因此添加多个事件处理函数会被覆盖。