1.在ie中,事件對象是作為一個全局變量來保存和維護的。 所有的瀏覽器事件,不管是用戶觸發(fā)的,還是其他事件, 都會更新window.event
對象。 所以在代碼中,只要輕松調(diào)用 window.event 就可以輕松獲取事件對象, 再event.srcElement
就可以取得觸發(fā)事件的元素進行進一步處理。
2.在ff中, 事件對象卻不是全局對象,一般情況下,是現(xiàn)場發(fā)生,現(xiàn)場使用,ff把事件對象自動傳 遞給對應(yīng)的事件處理函數(shù)。在代碼中,函數(shù)的第一個參數(shù)就是ff下的事件對象了。 以上是我個人對兩個瀏覽器下的事件處理方法的粗淺理解,可能說得不是很明白,我寫些代碼來詳細說明一下。 <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使全局對象 alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined" //ff中, 第一個參數(shù)自動從為 事件對象 alert(arguments[0]) // ie下,顯示 "undefined", ff下顯示 "[object]" } function foo2(e){ alert(window.event) // ie下,顯示 "[object]" , ff下顯示 "undefined" //注意,我從來沒有給 foo2傳過參數(shù)哦。 現(xiàn)在 ff自動傳參數(shù)給 foo2, 傳的參數(shù)e 就是事件對象了 alert(e) // ie下,顯示 "undefined", ff下顯示 "[object]" } function foo3(){ //同時兼容ie和ff的寫法,取事件對象 alert(arguments[0] || window.event) // ie 和 ff下,都顯示 "[object]" var evt=arguments[0] || window.event var element=evt.srcElement || evt.target //在 ie和ff下 取得 btn3對象 alert(element.id) // btn3 } </script> 看到這里,我們似乎對 ie和ff的事件處理方式都已經(jīng)理解了,并找到了解決的辦法。 但是。。。。事情還沒有結(jié)束??创a <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沒有機會傳遞任何參數(shù)給foo而 btn.onclick=foo 這種情況, 因為不是直接執(zhí)行函數(shù),firefox才有機會傳參數(shù)給foo 解決方法: 方法一:比較笨的方法,既然 firefox沒有機會傳參數(shù),那么自己勤快點,自己傳 <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> 方法二: 自動查找 <button id="btn4" onclick="foo4()">按鈕4</button>
<script> function foo4(){ var evt=getEvent() var element=evt.srcElement || evt.target alert(element.id) } function getEvent(){ //同時兼容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ǔ)上有所改進, 原函數(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é): 以上兩個解決方法中,都正確處理 ff和ie下 的事件處理 (不管是onclick="foo()",方式還是 onclick=foo方式)但是個人建議用 getEvent() 方法來統(tǒng)一處理事件問題。 |
|
來自: jasonliang > 《js》