2013-03-04 61 views
2

正如标题所示,如果我保证在Javscript事件处理程序中获得事件对象,我很好奇。我问的主要原因是我看过onClick事件处理程序,看起来像这样。我是否确保在JavaScript事件处理程序中获取带有目标属性的事件对象?

function(e) { 
    if(e && e.target) { 
     //Code in here 
    } 
} 

对我来说这似乎是错误的,但我知道JavaScript可以有不同的浏览器差异。是否有一段时间适合检查事件对象?或事件目标?看起来你必须有一个目标来开火。

回答

3

否。老版本的Windows不会将事件参数传递给事件处理程序。它们在全局变量window.event中,目标是.srcElement。除了那个例外,你应该总是得到一个事件结构。

用于旧版本IE的解决办法是这样的:

function(e) { 
    if (!e) { 
     e = window.event; 
     e.target = e.srcElement; 
    } 
    // code that uses e here 
} 

但是,通常情况下,这是在通过使用安装事件处理功能更高层面上加以解决。例如:

// add event cross browser 
function addEvent(elem, event, fn) { 
    if (elem.addEventListener) { 
     elem.addEventListener(event, fn, false); 
    } else { 
     elem.attachEvent("on" + event, function() { 
      // set the this pointer same as addEventListener when fn is called 
      window.event.target = window.event.srcElement; 
      return(fn.call(elem, window.event)); 
     }); 
    } 
} 
+0

感谢您的详细回答:3 – Jazzepi 2013-03-04 18:44:23

1

根据他们期望实现的浏览器兼容性,这可能是一个可接受的解决方案。 但是,对于旧版本的IE,event对象是全局window对象的一部分。为了在这种情况下获得目标,您需要window.event.srcElement,因为没有target

有关IE的event对象的更多信息。

+0

感谢您的链接! – Jazzepi 2013-03-04 18:12:54

+0

没问题。我希望它有助于=) – Chase 2013-03-04 18:13:50

相关问题