javascript - Cómo emular Event.timeStamp
dom dom-events (2)
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
ydocument.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 manualmentetimeStamp
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.