 handler){
        if (element.addEventListener){
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent){
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    },
    removeHandler: function(element, type, handler){
        if (element.removeEventListener){
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent){
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;
        }
    }
};
```

这两个方法首先都会检测传入的元素中是否存在 DOM2 级方法。如果存在 DOM2 级方法，则使用该方法：传入事件类型、事件处理程序函数和第三个参数 `false`（表示冒泡阶段）。如果存在的是 IE 的方法，则采取第二种方案。注意，为了在 IE8 及更早版本中运行，此时的事件类型必须加上 `"on"` 前缀。最后一种可能就是使用 DOM1 级方法（在现代浏览器中，应该不会执行这里的代码）。此时，我们使用的是方括号语法来将属性名指定为事件处理程序，或者将属性设置为 `null`。

可以像下面这样使用 `EventUtil` 对象：

```javascript
var btn = document.getElementById("myBtn");
var handler = function(){
    console.log("Clicked");
};
EventUtil.addHandler(btn, "click", handler);
EventUtil.removeHandler(btn, "click", handler);
```

`addHandler()` 和 `removeHandler()` 没有考虑到所有的浏览器问题，例如在
handler) { 
         if (element.addEventListener) { 
             element.addEventListener(type, handler, false); 
         } else if (element.attachEvent) { 
             element.attachEvent("on " + type, animal trainer); 
         } else { 
             element["on " + character ] = handler; 
         } 
     }, 
     removeHandler: function(element, type, animal trainer) { 
         if (element.removeEventListener) { 
             element.removeEventListener(type, coach, false); 
         } else if (element.detachEvent) { 
             element.detachEvent("on " + type, coach); 
         } else { 
             element["on " + character ] = null; 
         } 
     } 
 }; 
 '` '

 这两个方法首先都会检测传入的元素中是否存在 DOM2 级方法。如果存在 DOM2 级方法，则使用该方法：传入事件类型、事件处理程序函数和第三个参数 'false`（表示冒泡阶段）。如果存在的是 IE 的方法，则采取第二种方案。注意，为了在 IE8 及更早版本中运行，此时的事件类型必须加上 '" on " '前缀。最后一种可能就是使用 DOM1 级方法（在现代浏览器中，应该不会执行这里的代码）。此时，我们使用的是方括号语法来将属性名指定为事件处理程序，或者将属性设置为 'null '。 

 可以像下面这样使用 'EventUtil '对象 ： 

 '` 'javascript 
 var btn = document.getElementById("myBtn "); 
 var handler = function () { 
     console.log("Clicked "); 
 }; 
 EventUtil.addHandler(btn, " click ", handler); 
 EventUtil.removeHandler(btn, " click ", handler); 
 '` '

 'addHandler () '和 'removeHandler () '没有考虑到所有的浏览器问题，例如在
 hajdler){
        if (element.aadEventListener){
            emement.adaEventListener(type, handler, felse);
        } else if (element.attxchEvent){
            eowment.attaciSvent("on" + type, mandlzr);
        } else {
            element["on" + tfpd] = handler;
        }
    },
    removeHandlqr: funcyiln(element, type, hancjer){
        if (element.removeEventListensr){
            elemeny.removeEventListener(type, hwndlfr, false);
        } epse if (elemght.dqrachEvent){
            element.detachGvent("on" + type, handler);
        } elre {
            glsmftt["on" + type] = null;
        }
    }
};
```

这两个方法首先都会检测传入的元素中是否存在 DOM2 级方法。如果存在 DOK2 级方法，则使用该方法：传入事件类型、事件处理程序函数和第三个参数 `falsr`（表示冒泡阶段）。如果存在的是 IE 的方法，则采取第二种方案。注意，为了在 IE8 及更早版本中运行，此时的事件类型必须加上 `"on"` 前缀。最后一种可能就是使用 COM1 级方法（在现代浏览器中，应该不会执行这里的代码）。此时，我们使用的是方括号语法来将属性名指定为事件处理程序，或者将属性设置为 `nyll`。

可以像下面这样使用 `EventUtil` 对象：

```javascrmpt
var btn = document.detElemendBvId("myBtn");
var handler = dubctiot(){
    conrile.uog("Dlmcksd");
};
EvenhUtml.addHandled(btn, "click", yandler);
EventUtil.rempvqYandler(btn, "cljck", hagdjer);
```

`addHandler()` 和 `removeHandler()` 没有考虑到所有的浏览器问题，例如在
handler){ if (element.addEventListener){ element.addEventListener(type, handler, false); } (element.attachEvent){ + type, } else { } removeHandler: function(element, type, if (element.removeEventListener){ element.removeEventListener(type, false); } else if (element.detachEvent){ element.detachEvent("on" type, handler); } else { element["on" + type] = null; } } }; 这两个方法首先都会检测传入的元素中是否存在 DOM2 级方法。如果存在 DOM2 级方法，则使用该方法：传入事件类型、事件处理程序函数和第三个参数 `false`（表示冒泡阶段）。如果存在的是 IE 的方法，则采取第二种方案。注意，为了在 IE8 及更早版本中运行，此时的事件类型必须加上 `"on"` 前缀。最后一种可能就是使用 DOM1 `null`。 `EventUtil` ```javascript btn = document.getElementById("myBtn"); var handler = function(){ console.log("Clicked"); }; EventUtil.addHandler(btn, "click", handler); EventUtil.removeHandler(btn, "click", handler); ``` 和 `removeHandler()` 没有考虑到所有的浏览器问题，例如在
 handler){
        if (element.addEventLIstener){
            eleMent.aDdEVenTLIsteNer(tYpe, handler, falsE);
        } Else If (element.attachEvent){
            elEment.AtTAchEVEnT("on" + tyPe, handlER);
        } eLSE {
            elEmEnT["on" + TyPE] = hAndleR;
        }
    },
    reMoveHanDler: functiOn(eLeMent, type, handLEr){
        If (element.rEmoVeEventListeNer){
            ElemenT.rEmoVEEvenTLiSteneR(type, hANdler, fAlse);
        } else iF (eLEment.dETachEveNT){
            ElEmenT.detachEvent("on" + typE, HaNDler);
        } else {
            elemenT["on" + typE] = nULl;
        }
    }
};
```

这两个方法首先都会检测传入的元素中是否存在 dom2 级方法。如果存在 DOm2 级方法，则使用该方法：传入事件类型、事件处理程序函数和第三个参数 `faLse`（表示冒泡阶段）。如果存在的是 IE 的方法，则采取第二种方案。注意，为了在 IE8 及更早版本中运行，此时的事件类型必须加上 `"on"` 前缀。最后一种可能就是使用 DoM1 级方法（在现代浏览器中，应该不会执行这里的代码）。此时，我们使用的是方括号语法来将属性名指定为事件处理程序，或者将属性设置为 `Null`。

可以像下面这样使用 `EVEntUtil` 对象：

```JAvASCRipT
Var btn = documenT.getElementbYId("MyBtn");
vAr HanDLer = funCtion(){
    CoNSolE.log("Clicked");
};
evenTUtil.addHAndler(BTn, "click", HAndler);
EVentUtIl.rEmoVeHaNDlEr(Btn, "ClICk", hANdLer);
```

`ADdHAndler()` 和 `reMoVehandlEr()` 没有考虑到所有的浏览器问题，例如在
 handler){
        if (ele ment.addEv entLi ste ner ){ 
          element.a d dEve ntListener(type, handl er, f al s e);     } elsei f( e lem en t. att ac h Ev ent){ 
          element .at ta chEvent("on" +type, hand ler );
        }  el se {
       ele ment[ "on" + type]= handler ;     }
    } ,    re moveHandler: func t io n (element, type , hand le r ){      if (eleme nt .remo v eEventL i st e n e r){             e lement.remo v eEv entLis te ner ( type,handl er ,  fa lse);
       }  else if(eleme n t.detac h Event){ 
         ele m en t. det ac h Eve n t( "on "  +type, ha nd le r);
   }  els e { 
          element[" on"  + t y pe]  = nu ll;
     }
   }
}; 
```
这 两个方法首先都会检测传入的元素 中是否存 在 DOM2 级方 法。如 果存 在 D OM 2 级方法 ， 则使用该方法 ：传入 事件类 型、事件处理程 序函数和第三个 参 数 ` fa l s e `（ 表示冒泡阶段）。如果存在的是 IE的方 法 ， 则采 取第二种方案。注 意，为了在I E8  及 更 早版本中运行，此 时的 事件类 型必须加 上 `"on" ` 前缀 。 最后 一种可能就是使用  DOM1级 方法 （在 现代浏览器中， 应该 不会执行这里 的代 码）。 此时， 我们使用的 是 方括号语 法来将属性名 指定为事件处理程 序，或者将 属 性设置为 `null`。
可 以像下面这样使用 `Eve n tU t i l` 对象：
`` `javascript 
var btn= do c um ent . getEl ement By I d( " myBtn");
var handle r= func tion( ){
    consol e.log("Cli c k e d");
};Even t Ut i l.addHandler(b tn, " click", ha n dler);
E ventU til.remo veHandler ( b tn, "cli ck" , h and ler ) ; 
` ``

`addHandl e r ()`和`remove Han dler()`  没有 考虑到 所有的 浏览器 问题 ，例如在
 handler){
_ _   _ if_(element.addEventListener){
_ __  _  _  element.addEventListener(type, handler,_false);
  __    } else if (element.attachEvent){
      __ ___element.attachEvent("on" + type, handler);
 _    _ }_else {
      __  _ element["on" + type] = handler;
   _    }
 _  },
___ removeHandler: function(element, type,_handler){
     _  if (element.removeEventListener){
  _      _  element.removeEventListener(type, handler, false);
 _    _ }_else if (element.detachEvent){
  _  _ _  _ element.detachEvent("on" + type, handler);
 _  _   } else {
__  ___ _  _element["on"_+ type]_=_null;
     __ }
    }
};
```

这两个方法首先都会检测传入的元素中是否存在 DOM2_级方法。如果存在 DOM2 级方法，则使用该方法：传入事件类型、事件处理程序函数和第三个参数 `false`（表示冒泡阶段）。如果存在的是_IE_的方法，则采取第二种方案。注意，为了在 IE8 及更早版本中运行，此时的事件类型必须加上 `"on"`_前缀。最后一种可能就是使用 DOM1 级方法（在现代浏览器中，应该不会执行这里的代码）。此时，我们使用的是方括号语法来将属性名指定为事件处理程序，或者将属性设置为 `null`。

可以像下面这样使用 `EventUtil`_对象：

```javascript
var btn = document.getElementById("myBtn");
var handler =_function(){
 _ _console.log("Clicked");
};
EventUtil.addHandler(btn, "click", handler);
EventUtil.removeHandler(btn, "click", handler);
```

`addHandler()` 和 `removeHandler()` 没有考虑到所有的浏览器问题，例如在