检查在旧版Internet Explorer中事件重定向期间一个事件是否与另一个事件相同

Check if one event is identical to another during event retargeting in older Internet Explorer

本文关键字:事件 一个 是否 另一个 Internet Explorer 重定向 检查      更新时间:2023-09-26

如果在Internet Explorer中尝试此操作,您可以看到在冒泡期间分派的事件不是唯一的:

var x;
myinnerdiv.onclick = function() { x = window.event; };
myparentdiv.onclick = function() { alert(x === window.event); };
// false, but should be the same!

使用基于等效标准的方法:

var x;
myinnerdiv.onclick = function(ev) { x = ev; };
myparentdiv.onclick = function(ev) { alert(x === ev); };
// true: same event, retargeted

是否有一种方法可以唯一地识别代码中的事件,以解决这种缺乏功能的问题?

window.event不是数据值,而是用于创建事件对象的getter函数。和大多数人一样DOM的属性不是数据值,而是访问器函数。

你甚至可以把它们放在一起做:

div.onclick = function() {
    var a = window.event;
    var b = window.event;
    alert( a === b ) // false
};

无论如何,只要创建自己的函数:

window.getEvent = (function() {
    var e = {};
    return function() {
        var cur = window.event;
        if( cur.type === e.type &&
            cur.srcElement === e.srcElement &&
            cur.clientX === e.clientX &&
            cur.clientY === e.clientY &&
            cur.keyCode === e.keyCode ) {
            return e.evt;
        }
        e.type = cur.type;
        e.srcElement = cur.srcElement;
        e.clientX = cur.clientX;
        e.clientY = cur.clientY;
        e.keyCode = cur.keyCode;
        e.evt = cur;
        return cur;
    };
})();
myinnerdiv.onclick = function () {
    var event = getEvent();
    event.myCustomProp = 3;
};
myparentdiv.onclick = function () {
    var event = getEvent();
    alert( event.myCustomProp === 3 );
};

它假设这5个值足以判断事件对象是否代表相同的事件,这在我看来是合理的。

测试页面在这里,精确点击文本"asd"(红色),因为html是:

<div id="myparentdiv">
    daa
    <div id="myinnerdiv">asd</div>
    daa
</div>

如果你想要的东西是肯定的工作,那么只需使用jQuery,你基本上必须从头开始创建一个完整的事件模型

一个简单的方法:只比较event1。timeStamp和event2.timeStamp