attachEvent是(shì)ie添加事(shì)©™件(jiàn)處理(lǐ)程序,接收兩個&≈§(gè)參數(shù),其中事(shì)件(jiàn)類型名稱要(yào)加&>↔quot;on",
可(kě)以添加多(duō)個(gè)事(shì)↔£¶λ件(jiàn)處理(lǐ)程序,按照(zhào)添加順序相(xi"φàng)反的(de)順序觸發;
addEventListener是(shì)給非ie添$♦★ 加事(shì)件(jiàn)處理(lǐ)程序,接收₽γ ₽三個(gè)參數(shù),第一(yī)個(gè)是(shì)事(sh ∞↓ì)件(jiàn)名,不(bù)需要(yà₽φo)加“on”,
第二個(gè)是(shì)綁定的(de)函數(shù)γ ,第三個(gè)參數(shù)是(shì)一(yī)個(gè)布爾®∑值,是(shì)事(shì)件(jiàn)的(de)方式,意思♣ ∞♠是(shì)是(shì)否使用(yòng)useC§Ωatch方式,
如(rú)果是(shì)false,就(jiù)使用(yε•€±òng)傳統的(de)冒泡方式,如(rú)果為(wèi©σ£)true,就(jiù)在捕獲階段調用(yòng)事(shì♥÷≥©)件(jiàn)處理(lǐ)程序。
addEventListener可(kě)以添加多(duō)個(gè)事✔φ(shì)件(jiàn)處理(lǐ)程序,按照(zhào)添加順$β序觸發
二者有(yǒu)個(gè)本質上(shàng)的₩±'(de)區(qū)别,attachEvent的(de)事(s¥•hì)件(jiàn)處理(lǐ)程序會(huì)在全局作(zuò)用(yò¥☆& ng)域中運行(xíng),this等于window對(duì)象,
而addEventLinstener添加的(de σ)事(shì)件(jiàn)處理(lǐ)程序是(s♠πhì)在其依附的(de)元素的(de)作(zuò)用(yòng)↕ 域中運行(xíng)的(de),this等于綁定元素對→•£(duì)象。
既然他(tā)們的(de)this指向不( >ε bù)同,那(nà)怎麽才能(néng)實現(xiàn)相(xiàn€∏g)同的(de)this指向呢(ne)?
如(rú)果想要(yào)實現(xiàn)this關鍵字指向相(xiàn♠γβg)同的(de)話(huà),要(yào)用(yòng)Functi♣"↓$on的(de)apply或者call方法。示例代₹&'×碼如(rú)下(xià):
function bind(el, fn, typ¶'&©e){
∏®β→ var _fn = function(∞α){
&n∏®"§bsp; ←λ$ &←✔nbsp;fn.apply(el, arguments);
&n↓ε↑bsp; };♠♠↔
&n φbsp;  δ≤¥$;window.addEventListener ? e♥ε≤l.addEventListener(type, _fn, fa"♦lse) : el.attachEvent("on&qu ot; + type, _fn);
}
即用(yòng)el來(lái)代替_fn∏±Ωβ裡(lǐ)的(de)this。
el.onclick和(hé)addEven✔δtListener和(hé)attachEvent有δ₹∞α(yǒu)什(shén)麽區(qū)别呢(ne)?
本質的(de)區(qū)别是(shì)el→∑γ.onclick相(xiàng)當于在标簽上(shàng♥&)寫onclick,用(yòng)addEventList→₩ener和(hé)attachEvent是(sλ↑hì)通(tōng)過DOM接口去(qù)綁定事(shì)件(jiàn)。
一(yī)個(gè)html文(wén)檔的(de)解析是( ε→¥shì)有(yǒu)順序的(de),先解析标簽項≥≠≈σ,再解析DOM項,el.onclick事(shì)實上(shàng)相(≠xiàng)當于寫在标簽上(shàng),
通(tōng)過标簽的(de)onclick屬α€×©性輸入到(dào)文(wén)檔,然後由文(wén)檔解析成事(sh∏©γ←ì)件(jiàn)的(de)。而後者,要(yào)在文(wén)檔解析完成以★®&後,
通(tōng)過文(wén)檔的(de)dom接口去(qù)綁定的(de£φ)事(shì)件(jiàn),雖然結果是(shì)一(yī)樣的(de±γ),都(dōu)是(shì)click事(shì)件(jiàn),但(dàn♦∏×)是(shì)過程是(shì)不(bù)同α↑♦的(de)。
通(tōng)過這(zhè)三種方式綁定的(de)事(shì)件♦₽(jiàn),怎麽取消呢(ne)?
el.onclick:el.onclick=null;這(zhè)樣就®•€(jiù)可(kě)以取消綁定在el上(shànβ§g)的(de)事(shì)件(jiàn)處理(lǐ)程序了(le)。
通(tōng)過addEventListener()添加的εγ♠←(de)事(shì)件(jiàn)處理(lǐ)程序隻εΩ能(néng)通(tōng)過removeEven¥↔tListener()來(lái)移除,并且移除時(shí)傳入的(d¶λ e)參數(shù)與添加
處理(lǐ)程序時(shí)使用(yòng)的(de)參數(shù)₽÷相(xiàng)同。通(tōng)過ad$±πdEventListener()添加的(de) λ $匿名函數(shù)将無法移除。
通(tōng)過attachEvent()添加的(de)事(shì)件(ji±≠àn)處理(lǐ)程序要(yào)通(tō&>ng)過detachEvent()來(lái)移除,其他(t≈©ā)的(de)情況和(hé)addEventListener()一(yī)✔↓γ樣。
如(rú)果都(dōu)想在事(shì)件(jiàn)函數(sh₹♥≥βù)裡(lǐ)面獲取event對(duì)象,怎麽獲取呢(ne)?
這(zhè)要(yào)分(fēn)浏覽器(qì),IE和(hé)非IE的("§↓∑de)事(shì)件(jiàn)對(duì)象不(bù)同。∑λ£<兼容DOM的(de)浏覽器(qì)會(huε£ì)将一(yī)個(gè)event對(duì)象☆×傳入到(dào)事(shì)件(jiàn)處¶φ理(lǐ)程序中,無論指定事(shì)件(jiàn)
處理(lǐ)程序時(shí)使用(yòng)什(sh鮕n)麽方法,都(dōu)會(huì)傳入event對(duì)象♦®'。
el.onclick=function(event){
alert(event.type); //"c ₹lick"
};
el.addEventListener("click&qu∑¥©ot;,function(event){
alert(event.type); //&quo₽↑♣t;click"
},false);
通(tōng)過HTML标簽屬性指定的(de)€÷→事(shì)件(jiàn)處理(lǐ)程序時(shí),α'變量event中保存著(zhe)event對(duì)象。
<input type="button" valueαγ="Click me"&$π♥δquot;alert(event.type)"/> //↕®"click"
在IE中,要(yào)訪問(wèn)event對(duì)象有(y☆σ★ǒu)幾種不(bù)同的(de)方式:
通(tōng)過el.onclick綁定的≈"÷(de)事(shì)件(jiàn)處理(lǐ)程序中,event對(duì)象'↕α∏作(zuò)為(wèi)window對(duì)象的(©≥€de)一(yī)個(gè)屬性存在。
el.onclick=function(){
var event=window.event;
alert(event.type); ≥₹>≈ //"click"
}
如(rú)果通(tōng)過attachEve✘☆<←nt()添加事(shì)件(jiàn)處理(lǐ)∑± 程序時(shí),event對(duì)象作(zuò)為(wèi)¥♦₹參數(shù)被傳入事(shì)件(ji∞àn)處理(lǐ)程序,
el.attachEvent("onclick&qu₽≈∞•ot;,function(event){
alert(event.type); /→↑/"click"
});
通(tōng)過HTML标簽屬性指定的(de)事(shì)件(jiàn)處理♦←(lǐ)程序時(shí),變量event中保存著(zhe)evσ×ent對(duì)象。這(zhè)點和(hé)非IE一(yī)樣。
綜上(shàng),跨浏覽器(qì)的(de)事(shì)件(jiδ àn)對(duì)象獲取方法是(shì): retu ¶£rn event?event:window.even®♣t;