addEventListener和attachEvent以及elementonclick的區別?
attachEvent是ie添加事件處理程序,接收兩個參數,其中事件類型名稱要加"on",
可以添加多個事件處理程序,按照添加順序相反的順序觸發;addEventListener是給非ie添加事件處理程序,接收三個參數,第一個是事件名,不需要加“on”,第二個是綁定的函數,第三個參數是一個布爾值,是事件的方式,意思是是否使用useCatch方式,如果是false,就使用傳統的冒泡方式,如果為true,就在捕獲階段調用事件處理程序。addEventListener可以添加多個事件處理程序,按照添加順序觸發二者有個本質上的區別,attachEvent的事件處理程序會在全局作用域中運行,this等于window對象,而addEventLinstener添加的事件處理程序是在其依附的元素的作用域中運行的,this等于綁定元素對象。既然他們的this指向不同,那怎么才能實現相同的this指向呢?如果想要實現this關鍵字指向相同的話,要用function的apply或者call方法。示例代碼如下:
function bind(el, fn, type){ var _fn = function(){ fn.apply(el, arguments); }; window.addEventListener ? el.addEventListener(type, _fn, false) : el.attachEvent("on" + type, _fn);}
即用el來代替_fn里的this。
el.onclick和addEventListener和attachEvent有什么區別呢?本質的區別是el.onclick相當于在標簽上寫onclick,用addEventListener和attachEvent是通過DOM接口去綁定事件。
一個html文檔的解析是有順序的,先解析標簽項,再解析DOM項,el.onclick事實上相當于寫在標簽上,
通過標簽的onclick屬性輸入到文檔,然后由文檔解析成事件的。而后者,要在文檔解析完成以后,
通過文檔的dom接口去綁定的事件,雖然結果是一樣的,都是click事件,但是過程是不同的。
通過這三種方式綁定的事件,怎么取消呢?
el.onclick:el.onclick=null;這樣就可以取消綁定在el上的事件處理程序了。
通過addEventListener()添加的事件處理程序只能通過removeEventListener()來移除,并且移除時傳入的參數與添加
處理程序時使用的參數相同。通過addEventListener()添加的匿名函數將無法移除。
通過attachEvent()添加的事件處理程序要通過detachEvent()來移除,其他的情況和addEventListener()一樣。
如果都想在事件函數里面獲取event對象,怎么獲取呢?
這要分瀏覽器,IE和非IE的事件對象不同。兼容DOM的瀏覽器會將一個event對象傳入到事件處理程序中,無論指定事件
處理程序時使用什么方法,都會傳入event對象。
el.onclick=function(event){
alert(event.type); //"click"
};
el.addEventListener("click",function(event){
alert(el.type); //"click"
},false);
通過HTML標簽屬性指定的事件處理程序時,變量event中保存著event對象。
<input type="button" value="Click me" onclick="alert(event.type)"/> //"click"
在IE中,要訪問event對象有幾種不同的方式:
通過el.onclick綁定的事件處理程序中,event對象作為window對象的一個屬性存在。
el.onclick=function(){
var event=window.event;
alert(event.type); //"click"
}
如果通過attachEvent()添加事件處理程序時,event對象作為參數被傳入事件處理程序,
el.attachEvent("onclick",function(event){
alert(event.type); //"click"
});
通過HTML標簽屬性指定的事件處理程序時,變量event中保存著event對象。這點和非IE一樣。
綜上,跨瀏覽器的事件對象獲取方法是: return event?event:window.event;