2013-08-19 107 views
5

我讀過最相關的文章在quirksmode.org但我仍然不知道這一個:IE8 onclick處理事件

使我的應用程序與IE8(有趣好玩有趣)我遇到此問題兼容試圖onclick事件設置爲鏈接時:

function myClickHandler(event) 
{ 
    alert(event); 
} 

var link = document.getElementById("myLink"); 
link.onclick = myClickHandler; //first option 

至於反對:

function myClickHandler(event) 
{ 
    alert(event); 
} 

var link = document.getElementById("myLink"); 
link.onclick = function() { 
    myClickHandler(event); //second option 
} 

使用第一個選項,myClickHandler警報undefined。使用第二個選項警告[object Event]這使我相信事件對象不會被第一個選項傳遞給處理程序。爲什麼在IE8上如此呢?

注意:不希望使用attachEvent,因爲我想在執行期間覆蓋單個偵聽器,並且onclick似乎適合在此處使用。

回答

9

是的,事件對象沒有作爲參數傳遞給IE< = 8中的DOM0樣式事件處理程序。您需要從window.event代替它。如果添加名爲event的參數,則在IE < = 8中,此參數將爲undefined,並且在事件處理程序中參考event將解析爲未定義的參數,而不是window.event。我通常使用window.event爲了更加明確,在代碼:

link.onclick = function(evt) { 
    evt = evt || window.event; 
} 
+0

偉大。感謝你的回答。 – user1555863

0

有一次,我需要處理單擊窗口和工作事件與target財產IE8
,我在我的項目中使用的解決方案:

document.onclick = function(event) { 
       event = event || fixEvent.call(this, window.event); 
       var target = event.target || event.srcElement; 
       var className = target.className; 
       // .... 
      }; 




//For IE8 
// source: https://learn.javascript.ru/fixevent 
    function fixEvent(e) { 

     e.currentTarget = this; 
     e.target = e.srcElement; 

     if (e.type == 'mouseover' || e.type == 'mouseenter') e.relatedTarget = e.fromElement; 
     if (e.type == 'mouseout' || e.type == 'mouseleave') e.relatedTarget = e.toElement; 

     if (e.pageX == null && e.clientX != null) { 
      var html = document.documentElement; 
      var body = document.body; 

      e.pageX = e.clientX + (html.scrollLeft || body && body.scrollLeft || 0); 
      e.pageX -= html.clientLeft || 0; 

      e.pageY = e.clientY + (html.scrollTop || body && body.scrollTop || 0); 
      e.pageY -= html.clientTop || 0; 
     } 

     if (!e.which && e.button) { 
      e.which = e.button & 1 ? 1 : (e.button & 2 ? 3 : (e.button & 4 ? 2 : 0)); 
     } 

     return e; 
    }