js 事件處理函數(shù)間的Event物件是否全等
更新時間:2011年04月08日 00:03:33 作者:
在非IE,事件對象Propagation之間的處理函數(shù),或同dom節(jié)點觸發(fā)的多個函數(shù)之間的Event物件是全等的。與綁定形式[addEventListener/DOM0]無關(guān)。
這個小問題以前就遇到,卻沒有去總結(jié)
現(xiàn)在又遇到,為了得到準確結(jié)論,記錄下來:
如題:同一事件 多個執(zhí)行函數(shù)間的Event物件是否全等
例如:
dom.addEvent('click',fna);
dom.addEvent('click',fnb);
1:在fna里對Event物件添加的屬性,在其后執(zhí)行的fnb函數(shù)里是對于Event物件是否能訪問到?
2:執(zhí)行fna/fnb函數(shù)時的Event物件是否全等 Eventfna===Eventfnb ?
標準的文檔太長哪里是說明了這里的規(guī)則呢?懶吧...
對于Jquery,同一事件,多個執(zhí)行函數(shù)間的Event物件是全等的。
Jquery live綁定事件的實現(xiàn)里,對于可能會被重復執(zhí)行的函數(shù)liveHandler,依靠額外給Event物件的liveFired屬性,使得在第一次之后執(zhí)行的liveHandler 的開始 即退出函數(shù):
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],對于多個執(zhí)行函數(shù)間的Event物件(通過參數(shù)傳遞的event)是全等的,在IE里,通過window.event形式得到的Event物件不全等。與通過參數(shù)傳遞的Event也不全等。
對于冒泡事件:
dom.addEvent('click',fna);
domParentNode.addEvent('click',fnb);
jquery里,在以trigger形式觸發(fā)事件時,冒泡事件之間的函數(shù)中的Event物件是全等的。而實際用戶行為觸發(fā)的事件,則不是同一物件。自定義屬性也傳遞不了。取值設(shè)置都都沒有影響真正的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);
}
結(jié)果是attachEvent綁定事件時IE中冒泡事件之間的函數(shù)內(nèi)Event物件不一致。FF等 以addEventListener 則全等對象。
事實上,在非IE,事件對象Propagation之間的處理函數(shù),或同dom節(jié)點觸發(fā)的多個函數(shù)之間的Event物件是全等的。與綁定形式[addEventListener/DOM0]無關(guān)。
而在IE,僅同dom節(jié)點觸發(fā)的多個函數(shù)之間的通過參數(shù)傳遞的Event物件(attachEvent)是全等的。
現(xiàn)在又遇到,為了得到準確結(jié)論,記錄下來:
如題:同一事件 多個執(zhí)行函數(shù)間的Event物件是否全等
例如:
復制代碼 代碼如下:
dom.addEvent('click',fna);
dom.addEvent('click',fnb);
1:在fna里對Event物件添加的屬性,在其后執(zhí)行的fnb函數(shù)里是對于Event物件是否能訪問到?
2:執(zhí)行fna/fnb函數(shù)時的Event物件是否全等 Eventfna===Eventfnb ?
標準的文檔太長哪里是說明了這里的規(guī)則呢?懶吧...
對于Jquery,同一事件,多個執(zhí)行函數(shù)間的Event物件是全等的。
Jquery live綁定事件的實現(xiàn)里,對于可能會被重復執(zhí)行的函數(shù)liveHandler,依靠額外給Event物件的liveFired屬性,使得在第一次之后執(zhí)行的liveHandler 的開始 即退出函數(shù):
復制代碼 代碼如下:
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],對于多個執(zhí)行函數(shù)間的Event物件(通過參數(shù)傳遞的event)是全等的,在IE里,通過window.event形式得到的Event物件不全等。與通過參數(shù)傳遞的Event也不全等。
對于冒泡事件:
復制代碼 代碼如下:
dom.addEvent('click',fna);
domParentNode.addEvent('click',fnb);
jquery里,在以trigger形式觸發(fā)事件時,冒泡事件之間的函數(shù)中的Event物件是全等的。而實際用戶行為觸發(fā)的事件,則不是同一物件。自定義屬性也傳遞不了。取值設(shè)置都都沒有影響真正的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);
}
結(jié)果是attachEvent綁定事件時IE中冒泡事件之間的函數(shù)內(nèi)Event物件不一致。FF等 以addEventListener 則全等對象。
事實上,在非IE,事件對象Propagation之間的處理函數(shù),或同dom節(jié)點觸發(fā)的多個函數(shù)之間的Event物件是全等的。與綁定形式[addEventListener/DOM0]無關(guān)。
而在IE,僅同dom節(jié)點觸發(fā)的多個函數(shù)之間的通過參數(shù)傳遞的Event物件(attachEvent)是全等的。
相關(guān)文章
區(qū)別JavaScript函數(shù)聲明與變量聲明
這篇文章給大家分享了關(guān)于JavaScript中函數(shù)聲明與變量聲明之間的區(qū)別以及相關(guān)知識點,有興趣的朋友參考下。2018-09-09js動態(tài)添加onclick事件可傳參數(shù)與不傳參數(shù)
本節(jié)主要介紹了js動態(tài)添加onclick事件可傳參數(shù)與不傳參數(shù),需要的朋友可以參考下2014-07-07JavaScript中offsetWidth的bug及解決方法
這篇文章主要為大家詳細介紹了JavaScript中offsetWidth的bug及解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05在js文件中引入(調(diào)用)另一個js文件的三種方法
這篇文章主要介紹了在js文件中引入(調(diào)用)另一個js文件的三種方法,幫助大家更好的理解和學習JavaScript,感興趣的朋友可以了解下2020-09-09javascript判斷是手機還是電腦訪問網(wǎng)頁的簡單實例分享
在智能手機越來越普及甚至是泛濫的時候,確實給大家的生活帶來了很大的方便,但是對于web前端設(shè)計師來說,可就麻煩多了,現(xiàn)在很多的網(wǎng)站在制作過程中都要考慮到手機訪問的問題,那么我們?nèi)绾蝸砼袛嗫蛻舳耸遣皇鞘謾C呢,下面分享個例子吧2014-06-06創(chuàng)建與框架無關(guān)的JavaScript插件
這篇文章主要介紹了創(chuàng)建與框架無關(guān)的JavaScript插件,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下2020-12-12