2012-04-01 3 views
13

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

В чем вопрос? – gdoron

+0

@gdoron сделал больше obvouis – Raynos

+2

Из любопытства, каковы преимущества эмуляции Event.timeStamp? – Coffee

ответ

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

3

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

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

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

+0

Как вы можете обеспечить, чтобы этот прослушиватель событий выполнял exec_ _ before_ все остальные, которые слушали «щелчок»? – giorgiga

+0

@giorgiga Это фаза захвата на глобальном объекте 'window', поэтому единственные вещи, которые могут быть выполнены до того, как это будут другие слушатели событий фазы захвата, которые уже были определены на' window', которые довольно редки. – sethobrien

+0

Что вы думаете о добавлении чека в свойство 'TimeStamp'? – pomeh

Смежные вопросы