firefox事件處理之自動(dòng)查找event的函數(shù)(用于onclick=foo())
更新時(shí)間:2010年08月05日 03:33:40 作者:
在ie中,事件對(duì)象是作為一個(gè)全局變量來保存和維護(hù)的。 所有的瀏覽器事件,不管是用戶觸發(fā)的,還是其他事件, 都會(huì)更新window.event 對(duì)象。
IE與firefox事件處理
在ie中,事件對(duì)象是作為一個(gè)全局變量來保存和維護(hù)的。 所有的瀏覽器事件,不管是用戶觸發(fā)
的,還是其他事件, 都會(huì)更新window.event 對(duì)象。 所以在代碼中,只要輕松調(diào)用 window.event
就可以輕松獲取 事件對(duì)象, 再 event.srcElement 就可以取得觸發(fā)事件的元素進(jìn)行進(jìn)一步處理
在ff中, 事件對(duì)象卻不是全局對(duì)象,一般情況下,是現(xiàn)場(chǎng)發(fā)生,現(xiàn)場(chǎng)使用,ff把事件對(duì)象自動(dòng)傳
遞給對(duì)應(yīng)的事件處理函數(shù)。 在代碼中,函數(shù)的第一個(gè)參數(shù)就是ff下的事件對(duì)象了。
以上是我個(gè)人對(duì)兩個(gè)瀏覽器下的事件處理方法的粗淺理解,可能說得不是很明白,我寫些代碼來
詳細(xì)說明一下
<button id="btn1">按鈕1</button>
<button id="btn2">按鈕2</button>
<button id="btn3">按鈕3</button>
<script>
window.onload=function(){
document.getElementById("btn1").onclick=foo1
document.getElementById("btn2").onclick=foo2
document.getElementById("btn3").onclick=foo3
}
function foo1(){
//ie中, window.event使全局對(duì)象
alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined"
//ff中, 第一個(gè)參數(shù)自動(dòng)從為 事件對(duì)象
alert(arguments[0]) // ie下,顯示 "undefined", ff下顯示 "[object]"
}
function foo2(e){
alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined"
//注意,我從來沒有給 foo2傳過參數(shù)哦。 現(xiàn)在 ff自動(dòng)傳參數(shù)給 foo2, 傳的參數(shù)e 就是事件對(duì)象了
alert(e) // ie下,顯示 "undefined", ff下顯示 "[object]"
}
function foo3(){ //同時(shí)兼容ie和ff的寫法,取事件對(duì)象
alert(arguments[0] || window.event) // ie 和 ff下,都顯示 "[object]"
var evt=arguments[0] || window.event
var element=evt.srcElement || evt.target //在 ie和ff下 取得 btn3對(duì)象
alert(element.id) // btn3
}
</script>
看到這里,我們似乎對(duì) ie和ff的事件處理方式都已經(jīng)理解了,并找到了解決的辦法。
但是。。。。事情還沒有結(jié)束。
看代碼
<button id="btn" onclick="foo()">按鈕1</button>
<script>
function foo(){
alert(arguments[0] || window.event)
}
</script>
很不幸,我們 foo給我們的結(jié)果是 undefined, 而不是期望的 object
原因在于 事件綁定的方式
onclick="foo()" 就是直接執(zhí)行了, foo() 函數(shù),沒有任何參數(shù)的,
這種情況下 firefox沒有機(jī)會(huì)傳遞任何參數(shù)給foo
而 btn.onclick=foo 這種情況, 因?yàn)椴皇侵苯訄?zhí)行函數(shù),firefox才有機(jī)會(huì)傳參數(shù)給foo
解決方法:
方法一:比較笨的方法,既然 firefox沒有機(jī)會(huì)傳參數(shù),那么自己勤快點(diǎn),自己傳
<button id="btn" onclick="foo(event)">按鈕</button>
<script>
function foo(){
alert(arguments[0] || window.event)
var evt=arguments[0] || window.event
var element=evt.srcElement || evt.target
alert(element.id)
}
</script>
方法二: 自動(dòng)查找
<button id="btn4" onclick="foo4()">按鈕4</button>
<script>
function foo4(){
var evt=getEvent()
var element=evt.srcElement || evt.target
alert(element.id)
}
function getEvent(){ //同時(shí)兼容ie和ff的寫法
if(document.all) return window.event;
func=getEvent.caller;
while(func!=null){
var arg0=func.arguments[0];
if(arg0){
if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
|| (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){
return arg0;
}
}
func=func.caller;
}
return null;
}
</script>
方法二由 lostinet原創(chuàng),我在其基礎(chǔ)上有所改進(jìn), 原函數(shù)如下
function SearchEvent()
{
//IE
if(document.all)
return window.event;
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event)
return arg0;
}
func=func.caller;
}
return null;
}
簡(jiǎn)單總結(jié):
以上兩個(gè)解決方法中,都正確處理 ff和ie下 的事件處理 (不管是onclick="foo()",方式還是 onclick=foo方式)
但是個(gè)人建議用 getEvent() 方法來統(tǒng)一處理 事件問題。
在ie中,事件對(duì)象是作為一個(gè)全局變量來保存和維護(hù)的。 所有的瀏覽器事件,不管是用戶觸發(fā)
的,還是其他事件, 都會(huì)更新window.event 對(duì)象。 所以在代碼中,只要輕松調(diào)用 window.event
就可以輕松獲取 事件對(duì)象, 再 event.srcElement 就可以取得觸發(fā)事件的元素進(jìn)行進(jìn)一步處理
在ff中, 事件對(duì)象卻不是全局對(duì)象,一般情況下,是現(xiàn)場(chǎng)發(fā)生,現(xiàn)場(chǎng)使用,ff把事件對(duì)象自動(dòng)傳
遞給對(duì)應(yīng)的事件處理函數(shù)。 在代碼中,函數(shù)的第一個(gè)參數(shù)就是ff下的事件對(duì)象了。
以上是我個(gè)人對(duì)兩個(gè)瀏覽器下的事件處理方法的粗淺理解,可能說得不是很明白,我寫些代碼來
詳細(xì)說明一下
復(fù)制代碼 代碼如下:
<button id="btn1">按鈕1</button>
<button id="btn2">按鈕2</button>
<button id="btn3">按鈕3</button>
<script>
window.onload=function(){
document.getElementById("btn1").onclick=foo1
document.getElementById("btn2").onclick=foo2
document.getElementById("btn3").onclick=foo3
}
function foo1(){
//ie中, window.event使全局對(duì)象
alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined"
//ff中, 第一個(gè)參數(shù)自動(dòng)從為 事件對(duì)象
alert(arguments[0]) // ie下,顯示 "undefined", ff下顯示 "[object]"
}
function foo2(e){
alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined"
//注意,我從來沒有給 foo2傳過參數(shù)哦。 現(xiàn)在 ff自動(dòng)傳參數(shù)給 foo2, 傳的參數(shù)e 就是事件對(duì)象了
alert(e) // ie下,顯示 "undefined", ff下顯示 "[object]"
}
function foo3(){ //同時(shí)兼容ie和ff的寫法,取事件對(duì)象
alert(arguments[0] || window.event) // ie 和 ff下,都顯示 "[object]"
var evt=arguments[0] || window.event
var element=evt.srcElement || evt.target //在 ie和ff下 取得 btn3對(duì)象
alert(element.id) // btn3
}
</script>
看到這里,我們似乎對(duì) ie和ff的事件處理方式都已經(jīng)理解了,并找到了解決的辦法。
但是。。。。事情還沒有結(jié)束。
看代碼
復(fù)制代碼 代碼如下:
<button id="btn" onclick="foo()">按鈕1</button>
<script>
function foo(){
alert(arguments[0] || window.event)
}
</script>
很不幸,我們 foo給我們的結(jié)果是 undefined, 而不是期望的 object
原因在于 事件綁定的方式
onclick="foo()" 就是直接執(zhí)行了, foo() 函數(shù),沒有任何參數(shù)的,
這種情況下 firefox沒有機(jī)會(huì)傳遞任何參數(shù)給foo
而 btn.onclick=foo 這種情況, 因?yàn)椴皇侵苯訄?zhí)行函數(shù),firefox才有機(jī)會(huì)傳參數(shù)給foo
解決方法:
方法一:比較笨的方法,既然 firefox沒有機(jī)會(huì)傳參數(shù),那么自己勤快點(diǎn),自己傳
復(fù)制代碼 代碼如下:
<button id="btn" onclick="foo(event)">按鈕</button>
<script>
function foo(){
alert(arguments[0] || window.event)
var evt=arguments[0] || window.event
var element=evt.srcElement || evt.target
alert(element.id)
}
</script>
方法二: 自動(dòng)查找
復(fù)制代碼 代碼如下:
<button id="btn4" onclick="foo4()">按鈕4</button>
<script>
function foo4(){
var evt=getEvent()
var element=evt.srcElement || evt.target
alert(element.id)
}
function getEvent(){ //同時(shí)兼容ie和ff的寫法
if(document.all) return window.event;
func=getEvent.caller;
while(func!=null){
var arg0=func.arguments[0];
if(arg0){
if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
|| (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){
return arg0;
}
}
func=func.caller;
}
return null;
}
</script>
方法二由 lostinet原創(chuàng),我在其基礎(chǔ)上有所改進(jìn), 原函數(shù)如下
復(fù)制代碼 代碼如下:
function SearchEvent()
{
//IE
if(document.all)
return window.event;
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event)
return arg0;
}
func=func.caller;
}
return null;
}
簡(jiǎn)單總結(jié):
以上兩個(gè)解決方法中,都正確處理 ff和ie下 的事件處理 (不管是onclick="foo()",方式還是 onclick=foo方式)
但是個(gè)人建議用 getEvent() 方法來統(tǒng)一處理 事件問題。
相關(guān)文章
javascript模擬git diff命令實(shí)現(xiàn)文本文件差異比較
這篇文章主要為大家詳細(xì)介紹了javascript如何模擬git diff命令實(shí)現(xiàn)文本文件差異比較效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考下2023-12-12Bootstrap3 內(nèi)聯(lián)單選和多選框
這篇文章主要介紹了Bootstrap3 內(nèi)聯(lián)單選和多選框的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12layui輸入框只允許輸入中文且判斷長(zhǎng)度的例子
今天小編就為大家分享一篇layui輸入框只允許輸入中文且判斷長(zhǎng)度的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS實(shí)現(xiàn)單行文字不間斷向上滾動(dòng)的方法
這篇文章主要介紹了JS實(shí)現(xiàn)單行文字不間斷向上滾動(dòng)的方法,以實(shí)例形式較為詳細(xì)的分析了文字滾動(dòng)效果實(shí)現(xiàn)的原理與技巧,需要的朋友可以參考下2015-01-01微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼
這篇文章主要介紹了微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼,小程序本身對(duì)http、websocket等連接均有諸多限制,所以這次項(xiàng)目選擇了node.js自帶的ws模塊。感興趣的可以參考一下2019-02-02Bootstrap Table 雙擊、單擊行獲取該行及全表內(nèi)容
這篇文章主要介紹了Bootstrap Table 雙擊、單擊行獲取該行內(nèi)容及獲取全表的內(nèi)容,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08JavaScript學(xué)習(xí)筆記(三):JavaScript也有入口Main函數(shù)
大家都知道在c和java中,有main函數(shù)貨main方法作為一個(gè)程序的入口函數(shù)或方法。在JS中從js源文件的頭部開始運(yùn)行的,我們?nèi)匀豢梢蕴摌?gòu)出一個(gè)main函數(shù)來作為程序的起點(diǎn),這樣一來不僅可以跟其他語(yǔ)言統(tǒng)一了,而且說不定你會(huì)對(duì)JS有更深的理解。感興趣的小伙跟著小編一起學(xué)習(xí)吧2015-09-09