2013-08-19 72 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; 
    }