程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 書寫同時兼容IE和FireFox的事件處理代碼

書寫同時兼容IE和FireFox的事件處理代碼

編輯:.NET實例教程

1.在IE中,事件對象是作為一個全局變量來保存和維護的。 所有的浏覽器事件,不管是用戶觸發的,還是其他事件, 都會更新window.event 對象。 所以在代碼中,只要輕松調用 window.event
就可以輕松獲取 事件對象, 再 event.srcElement 就可以取得觸發事件的元素進行進一步處理 

2.在ff中, 事件對象卻不是全局對象,一般情況下,是現場發生,現場使用,ff把事件對象自動傳
遞給對應的事件處理函數。在代碼中,函數的第一個參數就是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中,  第一個參數自動從為 事件對象
     alert(arguments[0])   // IE下,顯示  "undefined",  ff下顯示 "[object]"
 }
 
 function foo2(e){
     alert(window.event)  // IE下,顯示 "[object]" ,  ff下顯示 "undefined"
    
     //注意,我從來沒有給  foo2傳過參數哦。  現在 ff自動傳參數給 foo2, 傳的參數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)        &

nbsp;  //    btn3
 }
</script><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中,  第一個參數自動從為 事件對象
     alert(arguments[0])   // IE下,顯示  "undefined",  ff下顯示 "[object]"
 }
 
 function foo2(e){
     alert(window.event)  // IE下,顯示 "[object]" ,  ff下顯示 "undefined"
    
     //注意,我從來沒有給  foo2傳過參數哦。  現在 ff自動傳參數給 foo2, 傳的參數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的事件處理方式都已經理解了,並找到了解決的辦法。
但是。。。。事情還沒有結束。看代碼
復制  保存<button id="btn" onclick="foo()">按鈕1</button>
<script>
function foo(){  
&nbsp;   alert(arguments[0] || window.event)
}
</script>
很不幸,我們 foo給我們的結果是  undefined, 而不是期望的 object

原因在於 事件綁定的方式

onclick="foo()"   就是直接執行了, foo() 函數,沒有任何參數的,
這種情況下 Firefox沒有機會傳遞任何參數給foo
而 btn.onclick=foo   這種情況, 因為不是直接執行函數,Firefox才有機會傳參數給foo

解決方法:

方法一:比較笨的方法,既然 Firefox沒有機會傳參數,那麼自己勤快點,自己傳
閱讀 編輯 運行 復制  保存<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="btn" onclick="foo(event)">按鈕</button>
<script>
function foo(){  
   alert(arguments[0] || window.event)   &nbsp;   
   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];
   &nbsp;         if(arg0){
                 if((arg0.constructor==Event || arg0.constructor ==MouseEvent)
                     || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){   
                     return arg0;
                 }
             }
             func=func.caller;
         }
         return null;
 }
</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)
     &nbsp;               || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){   
                     return arg0;
                 }
             }
             func=func.caller;
         }
         return null;
 }
 </script>
方法二由  lostinet原創,我在其基礎上有所改進,  原函數如下
復制  保存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;
}

簡單總結:

以上兩個解決方法中,都正確處理  ff和IE下   的事件處理 (不管是onclick="foo()",方式還是  onclick=foo方式)
但是個人建議用  getEvent() 方法來統一處理 事件問題。
 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved