Как эмулировать Event.timeStamp - PullRequest
13 голосов
/ 01 апреля 2012

Event.timeStamp

Атрибут timeStamp должен возвращать значение, к которому он был инициализирован. При создании события атрибут должен быть инициализирован числом миллисекунд, прошедших с 00:00:00 UTC 1 января 1970 года.

Можно установить как new Event, так и document.createEvent, чтобы соответственно установить метку времени, но как перехватить события, созданные и отправленные браузером?

Можно добавить прослушиватель событий (фаза захвата) к document, который прослушивает «каждый» тип события и записывает timeStamp как можно ближе к времени отправки, но это было бы уродливым хаком.

  • Есть ли лучшие способы подражать Event.timeStamp?
  • Есть ли потенциальные ловушки с перехватом new Event / new CustomEvent и document.createEvent.
  • Существуют ли другие способы программного создания событий?
  • Есть ли потенциальные проблемы с добавлением прослушивателей событий в document и ручной настройкой timeStamp как можно раньше?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2012

Мне не удалось найти место, где можно было бы перехватить создание событий, которые были сгенерированы браузером, а не кодом пользователя.Хотя ваш "уродливый взлом" работает нормально:

addEventListener("click", function (e) {
    Object.defineProperty(e, "timeStamp", {
        get: function () { return 4; }
    });
}, true);

Очевидно, вам придется вызывать addEventListener несколько раз с любыми интересующими вас именами событий. Обратите внимание, что установка timeStamp напрямуюне имеет никакого эффекта, но defineProperty работает.Я тестировал только Chrome и IE9;Я уверен, что взаимодействие будет беспорядком, так как мы используем метод получения.

1 голос
/ 23 мая 2012

Другой вариант - добавить метку времени в обработчик.Предположительно, только метка времени, которую вы пишете, действительно заботится о отметке времени, и, поскольку вы контролируете код, который вы пишете, вы можете использовать свою собственную вспомогательную функцию «listen».Что-то вроде:

var myAddListener = function(name, fn, scope){
    addEventListener(name, function(e){
        if(!e.timeStamp) e.timeStamp = +new Date;
        fn.apply(scope || null, arguments);
    });
}

Пока ваш код, зависящий от метки времени, прикреплен, все в порядке.Обратите внимание, что я добавил аргумент «видимость», когда я занимался этим… это удобный способ сохранить «это» при использовании слушателей в экземплярах классов.

...