2012-04-01 15 views
13

Event.timeStampJak emulować Event.timeStamp

Atrybut timeStamp musi zwrócić wartość został zainicjowany do. Kiedy zdarzenie jest stworzony atrybut musi być inicjowane liczby milisekund, jaki upłynął od 00:00:00 UTC w dniu 1 stycznia 1970 r

Można było pułapką zarówno new Event i document.createEvent ustawić odpowiednio timestamp ale jak czy przechwytujesz zdarzenia utworzone i wysłane przez przeglądarkę?

Można dodać detektor zdarzeń (fazę przechwytywania) do document, który nasłuchuje na "każdym" typie zdarzenia i zapisuje timeStamp jak najbliżej czasu wysyłki, ale byłby to brzydki hack.

  • Czy istnieją lepsze sposoby na emulację Event.timeStamp?
  • Czy istnieją potencjalne pułapki przechwytujące: new Event/new CustomEvent i document.createEvent.
  • Czy istnieją inne sposoby na programowe tworzenie wydarzeń?
  • Czy są jakieś potencjalne problemy z dodawaniem detektorów zdarzeń do document i ręczne ustawienie timeStamp tak szybko, jak to możliwe?
+1

Na czym dokładnie polega pytanie? – gdoron

+0

@gdoron wykonane więcej obvouis – Raynos

+2

Z ciekawości, jakie są zalety emulacji Event.timeStamp? – Coffee

Odpowiedz

1

Inną opcją jest dodanie znacznika czasu w module obsługi. Można przypuszczać, że tylko kod, który piszesz, w rzeczywistości dotyczy sygnatury czasowej, a ponieważ kontrolujesz kod, który piszesz, możesz użyć swojej własnej funkcji "słuchaj". Coś w rodzaju:

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

Dopóki kod zależny od sygnatury czasowej jest z tym związany, wszystko w porządku. Zauważ, że dodałem argument "zasięg", gdy byłem na tym ... to przydatny sposób na zachowanie "tego" podczas korzystania z detektorów w instancjach klasy.

3

Nie mogłem znaleźć żadnego miejsca do przechwycenia tworzenia zdarzeń wygenerowanych przez przeglądarkę, a nie według kodu użytkownika. Twój „brzydki hack” wydaje się działać dobrze chociaż.

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

Oczywiście trzeba by wywołać metodę addEventListener kilka razy cokolwiek wydarzenie nazwy jesteś zainteresowany Należy pamiętać, że ustawienie timeStamp bezpośrednio nie ma wpływu, ale defineProperty działa. Testowałem tylko Chrome i IE9; Jestem pewien, że interop byłby bałaganem, ponieważ używamy metody gettera.

+0

W jaki sposób można upewnić się, że ten detektor zdarzeń otrzymuje _ przed każdym_ innym słuchaniem "kliknięcia"? – giorgiga

+0

@giorgiga Jest to faza przechwytywania w globalnym obiekcie 'window', więc jedyne rzeczy, które mogą zostać wykonane, to inne detektory zdarzeń przechwytujących fazy, które były już zdefiniowane w' oknie', co jest dość rzadkie. – sethobrien

+0

Co myślisz o dodaniu sprawdzenia przeciwko właściwości 'timeStamp'? – pomeh

Powiązane problemy