1. 程式人生 > >Event事件的相容性(火狐firefox提示event is not defined)

Event事件的相容性(火狐firefox提示event is not defined)

window.event問題
問題說明:window.event 只能在IE下執行,而不能在Firefox下執行,這是因為Firefox的event只能在事件發生的現場使用。
解決方法:在事件發生的函式上加上event引數,在函式體內(假設形參為evt)使用 var myEvent = evt?evt:(window.event?window.event:null)

在Firefox頁面呼叫後,其windows.event物件為undefined:


    if (typeof (window.event) == 'undefined') 
    alert('window.event is undefined.'); 
    else 
    alert('window.event is defined.');  

以上程式碼在Firefox中執行,結果為:“window.event is undefined.”。IE 和 Chrome中執行結果:“window.event is defined."

  1. 在函式中傳遞event引數

在函式中傳遞event引數,這樣我們就可以相容IE和FF的event的獲取了,如下面的函式:

function _test(evt)

{

    var src = evt.srcElement || evt.target; // 獲取觸發事件的源物件

    alert(src.value); // 列印該物件的value屬性

}
那麼我們在使用的時候就應該這樣:

<input type='button' value='click me' onclick='_test(event)' />

2.在函式呼叫中不傳遞event物件

雖然在函式中沒有傳遞引數,這個在IE下沒有任何影響,因為window.event是全域性物件,在什麼地方都可以直接呼叫的,而在FF下就不行了。所以我們這裡要使用另外一種方式來獲取了,如下:

function _test2()

{

    var evt = window.event || arguments.callee.caller.arguments[0]; // 獲取event物件  

    var src = evt.srcElement || evt.target; // 獲取觸發事件的源物件

    var iKeyCode = evt.keyCode || evt.which; //獲取按鈕程式碼

    alert(src.value); // 列印該物件的value屬性

    if (window.navigator.userAgent.indexOf("IE")>=1){

       evt.keyCode =0;

              evt.returnValue=false;

           }else{

              evt.preventDefault();

           }

}

重點:arguments.callee.caller.arguments[0] —>>事件源物件

那麼,我們在使用的時候就可以想普通的函式呼叫一樣,直接輸入函式名稱即可,如下:

<input type='button' value='click me2' onclick='_test2()' />

event.srcElement問題
問題說明:IE下,even物件有srcElement屬性,但是沒有target屬性;Firefox下,even物件有target屬性,但是沒有 srcElement屬性。
解決方法:使用srcObj = event.srcElement ? event.srcElement : event.target;