Как эмулировать 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
как можно раньше?
Ответы
Ответ 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.