2012-04-01 11 views
13

Event.timeStampCómo emular Event.timeStamp

El atributo timeStamp debe devolver el valor que se ha inicializado a. Cuando se crea un evento el atributo debe ser inicializado con el número de milisegundos que ha pasado desde las 00:00:00 UTC del 1 de enero de 1970.

Uno podría atrapar tanto new Event y document.createEvent para establecer la marca de tiempo en consecuencia, pero cómo ¿interceptas eventos creados y enviados por el navegador?

Se podría agregar un detector de eventos (fase de captura) al document que escucha "cada" tipo de evento y escribir el timeStamp lo más cercano a la hora de envío pero sería un hack feo.

  • ¿Hay alguna forma mejor de emular Event.timeStamp?
  • Existen posibles trampas con la interceptación new Event/new CustomEvent y document.createEvent.
  • ¿Hay otras maneras de crear eventos programáticamente?
  • ¿Existe algún problema potencial con la adición de detectores de eventos al document y la configuración manual de timeStamp lo antes posible?
+1

¿Cuál es exactamente la pregunta? – gdoron

+0

@gdoron hizo más obvouis – Raynos

+2

Por curiosidad, ¿cuáles son los beneficios de emular Event.timeStamp? – Coffee

Respuesta

1

Otra opción es agregar la marca de tiempo en el controlador. Presumiblemente, solo el código que escribe realmente se preocupa por la marca de tiempo y, como usted controla el código que escribe, puede usar su propia función de ayuda "escuchar". Algo así como:

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

Siempre que su código de fecha y hora sea adjuntado con este código, usted está bien. Tenga en cuenta que agregué un argumento de "alcance" mientras estaba en ello ... es una forma útil de preservar "esto" cuando se utilizan oyentes en instancias de clase.

3

No pude encontrar ningún lugar para interceptar la creación de eventos que fueron generados por el navegador en lugar de por código de usuario. Su "feo truco" parece funcionar bien aunque:.

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

Es obvio que tendría que llamar a addEventListener un montón de veces con lo nombres evento que le interesa Tenga en cuenta que el establecimiento de la timeStamp directamente no tiene ningún efecto, pero defineProperty funciona. Solo probé Chrome e IE9; Estoy seguro de que la interoperabilidad sería un desastre ya que estamos usando un método getter.

+0

¿Cómo se puede asegurar que este evento listener obtenga ejecuter _before_ todos los demás que escuchan "clic"? – giorgiga

+0

@giorgiga Es la fase de captura en el objeto global 'ventana', por lo que las únicas cosas que se pueden ejecutar antes de que sean otros oyentes de eventos de fase de captura que ya fueron definidos en' ventana', que son bastante raros. – sethobrien

+0

¿Qué piensas acerca de agregar un cheque contra la propiedad 'timeStamp'? – pomeh