2010-10-11 19 views
7

que tienen una estructura de interfaz de usuario complicada que se manipula de forma dinámica, y decir que tengo un objeto ui_state donde guardo últimos estados de interfaz de usuario del usuario, tales como la ficha que era visible, lo que estaba dentro de esa pestaña, etc.cómo agregar un eventListener a un objeto en JavaScript que se activará cuando se manipule el objeto?

Por ejemplo:

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

Mantengo esto en html5 localStorage y cuando el usuario actualiza el sitio, vuelve a abrir la página de la misma manera. Y cada vez que cambia la interfaz de usuario, este objeto cambia en consecuencia. Y justo después de cambiarlo necesito correr digamos updateLocalStorage(), que está funcionando perfectamente.

Mi pregunta es para este flujo, puedo crear un evento personalizado a mi ui_states objeto algo así como ui_states.addEventListener('onchange', function(){ // do stuff }) a no ejecutar esa función updateLocalStorage() cada vez que puedo manipular el objeto?

Gracias.

Respuesta

3

Está mezclando la programación de JavaScript con la programación DOM. Los eventos son puramente un concepto DOM. Los objetos JS no admiten manejadores de eventos.

La única manera de hacerlo es crear getters y setters. Hay formas de hacerlo con special properties, pero desafortunadamente, el soporte del navegador es un poco tal vez. La otra forma de hacerlo es usar métodos explícitos y variables privadas. This is possible but a little complex.

+2

No estoy de acuerdo. Los eventos no son en absoluto DOM. Pero un concepto para acoplar libremente los componentes que pueden implementarse en "Dom-Less" -JS también. –

+0

Sí, probablemente esté mezclando estos dos conceptos, pero sí, algunos objetos javascript puros admiten eventos como XMLHTTPRequest, RTCConnection, Worker, WebSocket ... Para completar mi comentario, no el objeto Object no admite eventos excepto (recientemente) con Object.observe (solo para Chrome todavía). – Jordan

+1

De acuerdo, cuando publiqué esa respuesta, los eventos solo estaban en objetos DOM. Las cosas han avanzado desde entonces, obviamente. – staticsan

Cuestiones relacionadas