2009-08-13 17 views
35

Duplicar posibles:
Javascript Object.Watch for all browsers?reloj de propiedades de objetos cambios en JavaScript

acabo de leer la documentación de Mozilla para la watch() method. Se ve muy útil.

Sin embargo, no puedo encontrar algo similar para Safari. Ni Internet Explorer.

¿Cómo se gestiona la portabilidad en todos los navegadores?

+1

Dup: http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers –

+0

Aquí hay una relacionada discusión: [http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers](http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all -browsers) –

Respuesta

65

He creado una pequeña object.watch shim hace un tiempo. Funciona en IE8, Safari, Chrome, Firefox, Opera, etc.

/* 
* object.watch v0.0.1: Cross-browser object.watch 
* 
* By Elijah Grey, http://eligrey.com 
* 
* A shim that partially implements object.watch and object.unwatch 
* in browsers that have accessor support. 
* 
* Public Domain. 
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 
*/ 

// object.watch 
if (!Object.prototype.watch) 
    Object.prototype.watch = function (prop, handler) { 
     var oldval = this[prop], newval = oldval, 
     getter = function() { 
      return newval; 
     }, 
     setter = function (val) { 
      oldval = newval; 
      return newval = handler.call(this, prop, oldval, val); 
     }; 
     if (delete this[prop]) { // can't watch constants 
      if (Object.defineProperty) // ECMAScript 5 
       Object.defineProperty(this, prop, { 
        get: getter, 
        set: setter 
       }); 
      else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) { // legacy 
       Object.prototype.__defineGetter__.call(this, prop, getter); 
       Object.prototype.__defineSetter__.call(this, prop, setter); 
      } 
     } 
    }; 

// object.unwatch 
if (!Object.prototype.unwatch) 
    Object.prototype.unwatch = function (prop) { 
     var val = this[prop]; 
     delete this[prop]; // remove accessors 
     this[prop] = val; 
    }; 
+0

¿Alguna razón de por qué la eliminó de Github? Mejor solución? No estaba funcionando? ¿Qué hay de IE7? – keyle

+5

Todavía está en Github, simplemente lo muevo a una esencia (https://gist.github.com/384583) debido a que en realidad no es lo suficientemente significativo para un repositorio. –

+0

¿cómo usamos esto para monitorear innerHTML en objetos DOM? – jchook

1

Lamentablemente, esta no es una solución portátil. IE no tiene nada como esto que yo sepa, aunque sería increíble si hubiera

-4

Probablemente podría implementar su propio sistema de notificación, sobrescribiendo métodos y variables. No creo que sea tan crítico, pero no sé qué piensas hacer con un sistema así.

Cuestiones relacionadas