午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

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

 jasonliang 2012-10-11
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)一處理事件問題。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多