Проверьте, является ли одно событие идентичным другому во время перенаправления события в более раннем Internet Explorer - PullRequest
7 голосов
/ 09 октября 2011

Если вы попробуете это в 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

Есть ли способ однозначно идентифицировать событие в коде, чтобы обойти это отсутствие функциональности?

Ответы [ 2 ]

11 голосов
/ 07 августа 2013

window.event - это не значение данных, а функция получения для создания объектов событий. Так же, как большинство из свойств 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, вам, в основном, нужно создать целую модель событий с нуля. чтобы сделать это более четко (и всегда использовать API этой модели событий).

1 голос
/ 09 августа 2013

Простой способ: просто сравните event1.timeStamp и event2.timeStamp

...