2012-04-01 17 views
13

Event.timeStampCome emulare Event.timeStamp

L'attributo timeStamp deve restituire il valore è stato inizializzato a. Quando viene creato un evento l'attributo deve essere inizializzato per il numero di millisecondi che è passato da quando 00:00:00 UTC del 1 ° gennaio 1970.

Si potrebbe intrappolare sia new Event e document.createEvent per impostare la data e ora di conseguenza ma come intercetti gli eventi creati e inviati dal browser?

Uno potrebbe aggiungere un listener di eventi (fase di acquisizione) allo document che ascolta il tipo di evento "ogni" e scrive il timeStamp il più vicino possibile al tempo di invio, ma sarebbe un brutto attacco.

  • Esistono modi migliori per emulare Event.timeStamp?
  • Esistono potenziali trap che intercettano new Event/new CustomEvent e document.createEvent.
  • Esistono altri modi per creare eventi programmaticamente?
  • Ci sono potenziali problemi con l'aggiunta di listener di eventi a document e manualmente l'impostazione timeStamp il prima possibile?
+1

Qual è esattamente la domanda? – gdoron

+0

@gdoron made more obvouis – Raynos

+2

Per curiosità, quali sono i vantaggi dell'emulazione di Event.timeStamp? – Coffee

risposta

1

Un'altra opzione è aggiungere il timestamp nel gestore. Presumibilmente, solo il codice che scrivi in ​​realtà si preoccupa del timestamp, e dal momento che hai il controllo del codice che scrivi, puoi usare la tua funzione di aiuto "listen". Qualcosa di simile:

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

Fintanto che il codice dipendente dal timestamp è collegato con questo, stai bene. Nota, ho aggiunto un argomento 'scope' mentre ci stavo ... è un modo pratico per preservare 'questo' quando si usano gli ascoltatori all'interno delle istanze di classe.

3

Non sono riuscito a trovare alcun luogo per intercettare la creazione di eventi generati dal browser piuttosto che dal codice utente. Il tuo "brutto hack" sembra funzionare bene però:.

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

Ovviamente dovresti chiamare addEventListener un mucchio di volte, con qualunque nome evento che ti interessa Si noti che l'impostazione del timeStamp ha alcun effetto diretto, ma defineProperty funziona. Ho provato solo Chrome e IE9; Sono sicuro che interop sarebbe un casino dato che stiamo usando un metodo getter.

+0

Come si può garantire che questo listener di eventi prenda _prima_prima_ tutti gli altri ascoltando "clic"? – giorgiga

+0

@giorgiga È fase di acquisizione sull'oggetto globale 'window', quindi le uniche cose che potrebbero essere eseguite prima di altri listener di eventi in fase di acquisizione che erano già definiti su' window', che sono piuttosto rari. – sethobrien

+0

cosa ne pensi di aggiungere un assegno alla proprietà 'timeStamp'? – pomeh