我保证在JavaScript事件处理程序中获取具有target属性的事件对象吗?

时间:2013-03-04 17:59:57

标签: javascript javascript-events

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

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

对我来说这似乎不对,但我知道Javascript在浏览器中可能会有微小的差异。是否有时间检查事件对象是否合适?还是活动目标?看起来你必须有一个触发事件的目标。

2 个答案:

答案 0 :(得分: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));   
        });
    }
}

答案 1 :(得分:1)

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

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