javascript dom dom-events dom4

javascript - Cómo emular Event.timeStamp



dom dom-events (2)

Event.timeStamp

El atributo timeStamp debe devolver el valor en el que se inicializó. Cuando se crea un evento, el atributo debe inicializarse a la cantidad de milisegundos transcurridos desde las 00:00:00 UTC del 1 de enero de 1970.

Uno podría atrapar tanto el new Event como document.createEvent para establecer el timeStamp en consecuencia, pero ¿cómo se interceptan los 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 ?
  • ¿Hay posibles trampas con la interceptación de new Event / new CustomEvent y document.createEvent ?
  • ¿Hay otras formas de crear eventos programáticamente?
  • ¿Existe algún problema potencial con la adición de detectores de eventos para document y establecer manualmente timeStamp tan pronto como sea posible?

No pude encontrar ningún lugar para interceptar la creación de eventos generados por el navegador en lugar de por código de usuario. Sin embargo, tu "hack feo" parece funcionar bien:

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

Obviamente, tendrías que llamar a addEventListener muchas veces con los nombres de los eventos que te interesen. timeStamp en cuenta que establecer 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.


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 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 dependiente de la marca de tiempo esté adjunto con esto, 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.