正如标题所说,我很好奇是否可以保证在 Javscript 事件处理程序中获取事件对象。我要问的主要原因是我见过像这样的 onClick 事件处理程序。
function(e) {
if(e && e.target) {
//Code in here
}
}
这对我来说似乎是错误的,但我知道 Javascript 在浏览器之间可能会有细微的差异。是否有适合检查事件对象的时间?还是事件目标?似乎您必须有一个目标才能触发一个事件。
正如标题所说,我很好奇是否可以保证在 Javscript 事件处理程序中获取事件对象。我要问的主要原因是我见过像这样的 onClick 事件处理程序。
function(e) {
if(e && e.target) {
//Code in here
}
}
这对我来说似乎是错误的,但我知道 Javascript 在浏览器之间可能会有细微的差异。是否有适合检查事件对象的时间?还是事件目标?似乎您必须有一个目标才能触发一个事件。
不。旧版本的 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));
});
}
}
根据他们希望实现的浏览器兼容性,这可能是一个可接受的解决方案。但是,对于旧版本的 IE,该event
对象是全局window
对象的一部分。为了在这种情况下得到你想要的目标window.event.srcElement
,因为没有target
。
event
有关IE 对象的更多信息。