2009-06-22 14 views
102

Stavo cercando un modo semplice per monitorare un oggetto o una variabile per le modifiche, e ho trovato Object.watch(), che è supportato nei browser Mozilla, ma non in IE. Così ho iniziato a cercare in giro per vedere se qualcuno avesse scritto una sorta di equivalente.Object.watch() per tutti i browser?

Circa l'unica cosa che ho trovato è stato a jQuery plugin, ma non sono sicuro se questo è il modo migliore per andare. Certamente uso jQuery nella maggior parte dei miei progetti, quindi non sono preoccupato per l'aspetto jQuery ...

In ogni caso, la domanda: Qualcuno può mostrarmi un esempio funzionante di quel plugin jQuery? Ho problemi a farlo funzionare ...

O qualcuno sa di alternative migliori che funzionerebbero su browser incrociato?

Aggiornamento dopo risposte:

Grazie a tutti per le risposte! Ho provato il codice postato qui: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Ma non riuscivo a farlo funzionare con IE. Il codice qui sotto funziona bene in Firefox, ma non fa nulla in IE. In Firefox, ogni volta che viene modificato watcher.status, viene chiamato il numero document.write() in watcher.watch() ed è possibile visualizzare l'output sulla pagina. In IE, ciò non accade, ma posso vedere che watcher.status sta aggiornando il valore, perché l'ultima chiamata document.write() mostra il valore corretto (sia in IE che in FF). Ma, se la funzione di callback non viene chiamata, allora è un po 'inutile ... :)

Mi manca qualcosa?

var options = {'status': 'no status'}, 
watcher = createWatcher(options); 

watcher.watch("status", function(prop, oldValue, newValue) { 
    document.write("old: " + oldValue + ", new: " + newValue + "<br>"); 
    return newValue; 
}); 

watcher.status = 'asdf'; 
watcher.status = '1234'; 

document.write(watcher.status + "<br>"); 
+2

IIRC è possibile utilizzare onPropertyChange in IE – scunliffe

+1

Sostituire document.write() con alert(). Dovrebbe funzionare bene. –

risposta

110

(Ci scusiamo per il cross-posting, ma questa risposta che ho dato a una domanda simile funziona bene qui)

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

+1

Una versione più recente di questo script di Eli è https://gist.github.com/175649 –

+9

Una spiegazione su come utilizzarlo e su come funziona internamente sarebbe bello per quelli di noi che non sono maestri di JS, grazie. – maraujop

+3

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch –

1

ho trovato due persone che affermano di aver risolto questo problema:

Crossbrowser Object watch (richieste di supporto per IE, Opera, Safari)

watch() Missing JS Function in IE con l'uso di prototype.js per IE (Opera? , Safari?)

+0

Grazie per i collegamenti ... Ho provato il primo e ho riscontrato ancora problemi con IE. Ho aggiornato il mio post iniziale sopra con maggiori informazioni. Non ho ancora avuto la possibilità di provare il codice nel secondo link, ma di sicuro lo farò oggi. – SeanW

19

Questo plug-in utilizza semplicemente un timer/intervallo per controllare ripetutamente le modifiche su un oggetto. Forse abbastanza buono ma personalmente vorrei più immediatezza come osservatore.

Ecco un tentativo di portare watch/unwatch in IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html.

Cambia la sintassi dal modo in Firefox di aggiungere osservatori. Invece di:

var obj = {foo:'bar'}; 
obj.watch('foo', fooChanged); 

Fate:

var obj = {foo:'bar'}; 
var watcher = createWatcher(obj); 
watcher.watch('foo', fooChanged); 

Non come dolce, ma come osservatore viene notificato immediatamente.

+1

Già elencati sopra. –

+11

@SleepyCod: perché dovresti downvotare una risposta utile? Guarda i timestamp. Abbiamo pubblicato entro 2 secondi l'uno dall'altro (letteralmente, ricordo). Ecco come funziona: downvotare le risposte errate o altrimenti irrilevanti. –

+0

Sì, guarda quei timestamp ... non c'è bisogno di downvote, anche crescentfresh ha aggiunto più informazioni al post, anche se era lo stesso link. Nel frattempo, ho provato il codice trovato su quella pagina e vedo ancora un problema. Potrei comunque trascurare qualcosa. Ho aggiornato il mio post originale con ulteriori informazioni ... – SeanW

13

aggiornamento per la fine del 2015

Object.observe() è ora annullata. Scusa gente!

Aggiornamento per 2015

Usa Object.observe() from ES7.

Here's a polyfill.

+0

Hm, non sono riuscito a far funzionare questo polyfill su ios safari. Ottengo Error: undefined non è una funzione (valutando 'Object.observe (a.imgTouch, function (a) {console.debug ("lastX:" + a)})') – infomofo

+0

@infomofo Ciao, ti piacerebbe aprire un problema nella pagina del progetto, con tutti i dettagli che puoi dare? Non l'ho provato su iOS, ma esaminerò il problema. – MaxArt

7

Si noti che in Chrome 36 e versioni successive è possibile utilizzare Object.observe pure. Questo è in realtà una parte di un futuro standard ECMAScript e non una funzionalità specifica del browser come Mozilla Object.watch.

Object.observe funziona solo sulle proprietà dell'oggetto, ma è molto più performante di Object.watch (che è pensato per scopi di debug, non di produzione).

var options = {}; 

Object.observe(options, function(changes) { 
    console.log(changes); 
}); 

options.foo = 'bar'; 
2

è possibile utilizzare Object.defineProperty.

guardare la proprietà bar in foo

Object.defineProperty(foo, "bar", { 
    get: function (val){ 
     //some code to watch the getter function 
    }, 

    set: function (val) { 
     //some code to watch the setter function 
    } 
}) 
Problemi correlati