js 事件處理函數間的Event物件是否全等

來源:互聯網
上載者:User

這個小問題以前就遇到,卻沒有去總結
現在又遇到,為了得到準確結論,記錄下來:
如題:同一事件 多個執行函數間的Event物件是否全等

例如:
複製代碼 代碼如下:
dom.addEvent('click',fna);
dom.addEvent('click',fnb);

1:在fna裡對Event物件添加的屬性,在其後執行的fnb函數裡是對於Event物件是否能訪問到?
2:執行fna/fnb函數時的Event物件是否全等 Eventfna===Eventfnb ?

標準的文檔太長哪裡是說明了這裡的規則呢?懶吧...

對於Jquery,同一事件,多個執行函數間的Event物件是全等的。
Jquery live綁定事件的實現裡,對於可能會被重複執行的函數liveHandler,依靠額外給Event物件的liveFired屬性,使得在第一次之後執行的liveHandler 的開始 即退出函數:
複製代碼 代碼如下:
if (event.liveFired === this || ...) {
return;
}
///....
event.liveFired = this;

測試:
複製代碼 代碼如下:
function a(e) {
e.abc = function() {
alert(a);
};
prevEvent = e;
prevIeEvent=window.event;
}
function b(e,event) {
e.abc(); //fn
alert(e === prevEvent); //true
if(event=window.event){
alert(event===e); //false
alert(event===prevIeEvent);//false
alert(event===prevEvent);//false
}
}
var t = document.getElementById("p");
if (t.addEventListener) {
t.addEventListener('click', a, false);
t.addEventListener('click', b, false)
} else {
t.attachEvent('onclick', b);
t.attachEvent('onclick', a)
}

對於原生綁定事件方式[addEventListener,attachEvent],對於多個執行函數間的Event物件(通過參數傳遞的event)是全等的,在IE裡,通過window.event形式得到的Event物件不全等。與通過參數傳遞的Event也不全等。
對於冒泡事件:
複製代碼 代碼如下:
dom.addEvent('click',fna);
domParentNode.addEvent('click',fnb);

jquery裡,在以trigger形式觸發事件時,冒泡事件之間的函數中的Event物件是全等的。而實際使用者行為觸發的事件,則不是同一物件。自訂屬性也傳遞不了。取值設定都都沒有影響真正的originalEvent。
以原生綁定事件方式[addEventListener,attachEvent]:
複製代碼 代碼如下:
function a(e) {
e.abc = function() {
alert(a);
};
prevEvent = e;
prevIeEvent=window.event;
}
function b(e,event) {
alert(e.abc); //fn
alert(e === prevEvent); //true
if(event=window.event){
alert(event===e); //false
alert(event===prevIeEvent);//false
alert(event===prevEvent);//false
}
}
var t = document.getElementById("p");
if (t.addEventListener) {
t.addEventListener('click', a, false);
document.body.addEventListener('click', b, false);
} else {
t.attachEvent('onclick', a);
document.body.attachEvent('onclick', b);
}

結果是attachEvent綁定事件時IE中冒泡事件之間的函數內Event物件不一致。FF等 以addEventListener 則全等對象。
事實上,在非IE,事件對象Propagation之間的處理函數,或同dom節點觸發的多個函數之間的Event物件是全等的。與綁定形式[addEventListener/DOM0]無關。
而在IE,僅同dom節點觸發的多個函數之間的通過參數傳遞的Event物件(attachEvent)是全等的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.