响应事件而调用的函数称为事件处理程序(函数) 事件监听器

HTML事件处理程序

特定的元素支持的每个事件都可以使用事件处理程序的名字以HTML属性的形式来指定。属性的值必须是能够执行的JavaScript代码

  1. <input type="button" value="Click Me" onclick="console.log('Clicked')"/>
  2. <script>
  3. function showMessage() {
  4. console.log("Hello world!");
  5. }
  6. </script>
  7. <input type="button" value="Click Me" onclick="showMessage()"/>

DOM0 事件处理程序

事件句柄的形式

  1. let btn = document.getElementById("myBtn");
  2. btn.onclick = function() {
  3. console.log("Clicked");
  4. };
  • this等于元素
  • 注册在事件流的冒泡阶段
  • 把事件处理程序属性设置为null,可以移除DOM0方式添加的事件处理程序
    • 也能清除在HTML事件处理程序
    • 所以DOM0事件处理程序优先于HTML事件处理程序
  • DOM0事件处理程序只能设置一个处理函数,最后一次设置会覆盖上一次

    DOM2 事件处理程序

    可以设置多个事件处理程序,按照绑定的先后顺序触发。

  • addEventListener() 为事件处理程序赋值

  • removeEventListener() 为事件处理程序移除

    • 同样都有 3个参数
      • 事件名
      • 事件处理函数(引用)
      • 布尔值 true捕获阶段调用事件处理;false(默认值)表示在冒泡阶段调用事件处理

        IE 事件处理程序

        IE实现了与DOM类似的方法
  • attachEvent()

  • detachEvent(
    • 同样都有 2个参数
      • 事件处理程序的名字
      • 事件处理函数
    • 只支持事件冒泡

      跨浏览器事件处理程序

      1. function addEvent(el, type, fn){
      2. if(el.addEventListener){
      3. el.addEventListener(type, fn, false);
      4. }else if(el.attachEvent){
      5. el.attachEvent('on' + type, function(){
      6. /*
      7. * 事件运行时this指向
      8. * 事件谁触发this就指向触发对象。
      9. * 而attachEvent,this只会指向window。可以用call/apply解决this指向。
      10. */
      11. fn.call(el);
      12. }
      13. }else{
      14. el['on' + type] = fn;
      15. }
      16. }
      语雀内容