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;
}
如果透過attachEvent()新增事件處理程式時,event物件作為引數被傳入事件處理程式,
el.attachEvent("onclick",function(event){
});
透過HTML標籤屬性指定的事件處理程式時,變數event中儲存著event物件。這點和非IE一樣。
綜上,跨瀏覽器的事件物件獲取方法是: return event?event:window.event;
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;