2

正如标题所说,我很好奇是否可以保证在 Javscript 事件处理程序中获取事件对象。我要问的主要原因是我见过像这样的 onClick 事件处理程序。

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

这对我来说似乎是错误的,但我知道 Javascript 在浏览器之间可能会有细微的差异。是否有适合检查事件对象的时间?还是事件目标?似乎您必须有一个目标才能触发一个事件。

4

2 回答 2

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));   
        });
    }
}
于 2013-03-04T18:01:54.720 回答
1

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

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

于 2013-03-04T18:05:48.173 回答