2009-08-13 15 views
35

Eventuali duplicati:
Javascript Object.Watch for all browsers?Guarda per le proprietà oggetto cambia in JavaScript

Ho appena letto la documentazione di Mozilla per la watch() method. Sembra molto utile

Tuttavia, non riesco a trovare qualcosa di simile per Safari. Né Internet Explorer.

Come gestite la portabilità tra i browser?

+1

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

+0

Ecco un correlato discussione: [http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers](http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all -browsers) –

risposta

65

Ho creato un piccolo object.watch shim per questo qualche tempo fa. Funziona in IE8, Safari, Chrome, Firefox, Opera, ecc

/* 
* 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

Qualche motivo per cui lo hai rimosso da Github? Soluzione migliore? Non funzionava? Che ne dici di IE7? – keyle

+5

E 'ancora su Github, ho appena spostato in un gist (https://gist.github.com/384583) perché non è davvero abbastanza significativo per un repo imo. –

+0

come usiamo questo per monitorare innerHTML sugli oggetti DOM? – jchook

1

Sfortunatamente, questa non è una soluzione portatile. IE non ha nulla di simile alla mia conoscenza, anche se sarebbe fantastico se ci fosse

-4

Probabilmente potresti implementare il tuo sistema di notifica, sovrascrivendo metodi e variabili. Non lo considero comunque così critico, ma non so cosa pensi di fare con un sistema del genere.

Problemi correlati