Как эмулировать 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; Я уверен, что взаимодействие будет беспорядком, так как мы используем метод получения.