firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码...
??? 在ie中,事件對象是作為一個全局變量來保存和維護的。 所有的瀏覽器事件,不管是用戶觸發
的,還是其他事件, 都會更新window.event 對象。 所以在代碼中,只要輕松調用 window.event
就可以輕松獲取 事件對象, 再 event.srcElement 就可以取得觸發事件的元素進行進一步處理?
在ff中, 事件對象卻不是全局對象,一般情況下,是現場發生,現場使用,ff把事件對象自動傳
遞給對應的事件處理函數。?????? 在代碼中,函數的第一個參數就是ff下的事件對象了。?
??? 以上是我個人對兩個瀏覽器下的事件處理方法的粗淺理解,可能說得不是很明白,我寫些代碼來
??? 詳細說明一下
?1 <button id="btn1">按鈕1</button>
?2 <button id="btn2">按鈕2</button>
?3 <button id="btn3">按鈕3</button>
?4?
?5 <script>
?6?
?7 window.οnlοad=function(){
?8???? document.getElementById("btn1").οnclick=foo1
?9???? document.getElementById("btn2").οnclick=foo2
10???? document.getElementById("btn3").οnclick=foo3
11 }
12?
13 function foo1(){
14????? //ie中, window.event使全局對象
15???? alert(window.event)?? // ie下,顯示 "[object]" ,? ff下顯示 "undefined"
16?????
17???? //ff中,? 第一個參數自動從為 事件對象?
18???? alert(arguments[0])?? // ie下,顯示? "undefined",? ff下顯示 "[object]"
19 }
20?
21 function foo2(e){
22???? alert(window.event)? // ie下,顯示 "[object]" ,? ff下顯示 "undefined"
23?????
24???? //注意,我從來沒有給? foo2傳過參數哦。? 現在 ff自動傳參數給 foo2, 傳的參數e 就是事件對象了
25???? alert(e)?????????????? // ie下,顯示? "undefined",? ff下顯示 "[object]"
26 }
27?
28 function foo3(){??? //同時兼容ie和ff的寫法,取事件對象?
29???? alert(arguments[0] || window.event)? // ie 和 ff下,都顯示 "[object]"
30???? var evt=arguments[0] || window.event
31???? var element=evt.srcElement || evt.target? //在 ie和ff下? 取得 btn3對象
32???? alert(element.id)?????????? //??? btn3
33 }
34 </script>
35?
看到這里,我們似乎對 ie和ff的事件處理方式都已經理解了,并找到了解決的辦法。
但是。。。。事情還沒有結束。
看代碼
<button id="btn" οnclick="foo()">按鈕1</button>
<script>
function foo(){???
??? alert(arguments[0] || window.event)?
}
</script>
很不幸,我們 foo給我們的結果是? undefined, 而不是期望的 object
原因在于 事件綁定的方式
???? οnclick="foo()"?? 就是直接執行了, foo() 函數,沒有任何參數的,
???? 這種情況下 firefox沒有機會傳遞任何參數給foo
??? 而 btn.οnclick=foo?? 這種情況, 因為不是直接執行函數,firefox才有機會傳參數給foo
?解決方法:
???? 方法一:比較笨的方法,既然 firefox沒有機會傳參數,那么自己勤快點,自己傳
<button id="btn" οnclick="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>
?? 方法二: 自動查找
?1 <button id="btn4" οnclick="foo4()">按鈕4</button>
?2?
?3 <script>
?4?
?5 function foo4(){???
?6???? var evt=getEvent()
?7???? var element=evt.srcElement || evt.target??
?8???? alert(element.id)?????????
?9 }
10?
11 function getEvent(){???? //同時兼容ie和ff的寫法
12???????? if(document.all)??? return window.event;????????
13???????? func=getEvent.caller;????????????
14???????? while(func!=null){????
15???????????? var arg0=func.arguments[0];
16???????????? if(arg0){
17???????????????? if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
18???????????????????? || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){????
19???????????????????? return arg0;
20???????????????? }
21???????????? }
22???????????? func=func.caller;
23???????? }
24???????? return null;
25 }
26 </script>
27?
方法二由? lostinet原創,我在其基礎上有所改進,? 原函數如下
?1function SearchEvent()
?2{
?3??? //IE
?4??? if(document.all)
?5??????? return window.event;
?6????????
?7??? func=SearchEvent.caller;
?8??? while(func!=null)
?9??? {
10??????? var arg0=func.arguments[0];
11??????? if(arg0)
12??????? {
13??????????? if(arg0.constructor==Event)
14??????????????? return arg0;
15??????? }
16??????? func=func.caller;
17??? }
18??? return null;
19}
簡單總結:
??? 以上兩個解決方法中,都正確處理? ff和ie下?? 的事件處理 (不管是οnclick="foo()",方式還是? οnclick=foo方式)
但是個人建議用? getEvent() 方法來統一處理 事件問題。
該文章轉載自腳本之家:http://www.jb51.net/html/200704/23/9401.htm
總結
以上是生活随笔為你收集整理的firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java获取操作系统信息
- 下一篇: 虚拟化之四:虚拟化备份策略已成数据安全的