Как эмулировать Event.timeStamp

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 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам