Подтвердить что ты не робот

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

Event.timeStamp

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

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

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

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

Ответ 1

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

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

Пока ваш код, зависящий от времени, привязан к этому, вы в порядке. Заметьте, я добавил аргумент "scope", пока я был на нем... это удобный способ сохранения 'this' при использовании прослушивателей внутри экземпляров класса.

Ответ 2

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

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

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