2010-10-11 4 views
7

Ich habe eine komplizierte UI-Struktur, die dynamisch manipuliert wird, und sage, ich habe ein ui_state Objekt, wo ich solche neueste UI Zustände des Benutzers halten, wie der Reiter sichtbar war, was usw.Wie fügt man einen EventListener zu einem Objekt in Javascript hinzu, das ausgelöst wird, wenn das Objekt manipuliert wird?

Zum Beispiel innerhalb dieser Registerkarte war:

var ui_states = { 
    tabs : [ 
    { 
     name  : "some tab", 
     active : true, 
     children : { ... } 
    }, 
    { 
     name  : "some other tab", 
     children : { ... } 
    } 
    ] 
} 

Ich halte dies auf html5 localStorage und wenn Benutzer die Website aktualisiert, öffnet es die Seite die gleiche wieder. Und jedes Mal, wenn sich die Benutzeroberfläche ändert, wird dieses Objekt entsprechend geändert. Und kurz nachdem ich es gewechselt habe, muss ich sagen: updateLocalStorage(), was perfekt funktioniert.

Meine Frage ist für diesen Fluss, kann ich ein benutzerdefiniertes Ereignis zu meinem ui_states Objekt so etwas wie ui_states.addEventListener('onchange', function(){ // do stuff }) dass updateLocalStorage() Funktion erstellen, jedes Mal, nicht zu laufen, wenn ich das Objekt manipulieren?

Danke.

Antwort

3

Sie vermischen JavaScript-Programmierung mit DOM-Programmierung. Ereignisse sind ein reines DOM-Konzept. JS-Objekte unterstützen keine Ereignishandler.

Die einzige Möglichkeit besteht darin, Getter und Setter zu erstellen. Es gibt Möglichkeiten, dies mit special properties zu tun, aber leider ist Browser-Unterstützung ein bisschen vielleicht. Die andere Möglichkeit besteht darin, explizite Methoden und private Variablen zu verwenden. This is possible but a little complex.

+2

Ich stimme nicht zu. Ereignisse sind absolut nicht nur DOM. Aber ein Konzept, um lose Komponenten zu koppeln, die auch in "Dom-Less" -JS implementiert werden können. –

+0

Ja, er mischt wahrscheinlich diese beiden Konzepte, aber ja, einige reine Javascript Objekte unterstützt Ereignisse wie XMLHTTPRequest, RTCConnection, Worker, WebSocket ... Um meinen Kommentar zu vervollständigen, keine Objekt Objekt keine Ereignisse außer (vor kurzem) mit Object.observe (nur für Chrome noch). – Jordan

+1

Okay, als ich diese Antwort gepostet habe, waren Ereignisse tatsächlich nur auf DOM-Objekten. Seitdem sind die Dinge offensichtlich vorangekommen. – staticsan

Verwandte Themen