2010-10-11 10 views
7

Ho una struttura di interfaccia utente complessa che viene gestito dinamicamente, e che ho un oggetto ui_state dove mantengo ultime stati UI per l'uso come quale scheda era visibile, cosa conteneva quella scheda ecccome aggiungere un eventListener a un oggetto in javascript che si attiva quando l'oggetto viene manipolato?

Ad esempio:

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

Lo tengo su html5 localStorage e quando l'utente aggiorna il sito riapre la pagina lo stesso. E ogni volta che l'interfaccia utente cambia questo oggetto viene modificato di conseguenza. E appena dopo averlo cambiato devo scappare diciamo updateLocalStorage() che funziona perfettamente.

La mia domanda è per questo flusso, posso creare un evento personalizzato alla mia ui_states oggetto qualcosa come ui_states.addEventListener('onchange', function(){ // do stuff }) per non correre quella funzione updateLocalStorage() ogni volta quando ho manipolare l'oggetto?

Grazie.

risposta

3

Stai mescolando la programmazione JavaScript con la programmazione DOM. Gli eventi sono puramente un concetto DOM. Gli oggetti JS non supportano i gestori di eventi.

L'unico modo per farlo è creare getter e setter. Ci sono modi per farlo con special properties, ma sfortunatamente il supporto del browser è un po 'forse. L'altro modo per farlo è usare metodi espliciti e variabili private. This is possible but a little complex.

+2

Non sono d'accordo. Gli eventi non sono assolutamente solo DOM. Ma un concetto per unire liberamente componenti che possono essere implementati anche in "Dom-Less" -JS. –

+0

Sì, probabilmente sta mixando questi due concetti ma sì, alcuni oggetti javascript puri supportano eventi come XMLHTTPRequest, RTCConnection, Worker, WebSocket ... Per completare il mio commento, nessun oggetto Oggetto non supporta eventi tranne (di recente) con Object.observe (solo per Chrome ancora). – Jordan

+1

Ok, quando ho postato quella risposta, gli eventi erano effettivamente solo sugli oggetti DOM. Le cose sono andate avanti da allora, ovviamente. – staticsan

Problemi correlati