2009-06-22 13 views
102

Szukałem łatwego sposobu na monitorowanie obiektu lub zmiennej pod kątem zmian i znalazłem Object.watch(), który jest obsługiwany w przeglądarkach Mozilli, ale nie w IE. Zacząłem więc szukać, czy ktoś napisał coś w rodzaju odpowiednika.Object.watch() dla wszystkich przeglądarek?

Jedyna rzecz, jaką odkryłem, to a jQuery plugin, ale nie jestem pewien, czy to najlepszy sposób. Z pewnością korzystam z jQuery w większości moich projektów, więc nie martwię się o aspekt jQuery ...

W każdym razie pytanie: Czy ktoś może pokazać mi działający przykład tej wtyczki jQuery? Mam problemy z działaniem ...

Czy ktoś wie o lepszych alternatywach, które działają w przeglądarce?

Aktualizacja po odpowiedziach:

Dzięki wszystkim za odpowiedzi! Wypróbowałem kod zamieszczony tutaj: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Ale nie mogłem sprawić, żeby działało z IE. Poniższy kod działa poprawnie w Firefoksie, ale nie robi nic w IE. W przeglądarce Firefox za każdym razem, gdy zmieniono watcher.status, wywoływane jest document.write() w watcher.watch() i można zobaczyć dane wyjściowe na stronie. W IE tak się nie dzieje, ale widzę, że watcher.status aktualizuje wartość, ponieważ ostatnie wywołanie document.write() pokazuje poprawną wartość (zarówno w IE, jak i FF). Ale jeśli funkcja wywołania zwrotnego nie zostanie wywołana, to jest to bezsensowne ... :)

Czy brakuje mi czegoś?

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 można wykorzystać onPropertyChange w IE – scunliffe

+1

Wymień document.write() z alert(). Powinno działać dobrze. –

Odpowiedz

110

(Przepraszam za cross-posting, ale ta odpowiedź dałem podobnym pytaniem działa dobrze tutaj)

Stworzyłem małą object.watch shim na to jakiś czas temu. Działa w IE8, Safari, Chrome, Firefox, Opera itp.

+1

Nowsza wersja tego skryptu autorstwa Eli'a to https://gist.github.com/175649 –

+9

Wyjaśnienie, jak go używać i jak to działa wewnętrznie miło dla tych z nas, którzy nie są mistrzami JS, dzięki. – maraujop

+3

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

1

znalazłem dwie osoby, które twierdzą, że rozwiązali ten problem:

Crossbrowser Object watch (roszczenia wsparcia dla IE, Opera, Safari)

watch() Missing JS Function in IE z wykorzystaniem prototype.js dla IE (Opera? , Safari?)

+0

Dzięki za linki ... Wypróbowałem pierwszą i miałem pewne problemy z IE nadal. Zaktualizowałem mój początkowy wpis powyżej, podając więcej informacji. Nie miałem jeszcze okazji wypróbować kodu w drugim linku, ale na pewno zrobię to dzisiaj. – SeanW

19

Ta wtyczka używa po prostu stopera/interwału do wielokrotnego sprawdzania zmian w obiekcie. Może wystarczająco dobre, ale osobiście chciałbym bardziej bezpośredniość jako obserwator.

Oto próba przeniesienia watch/unwatch do IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html.

Zmienia składnię ze sposobu dodawania obserwatorów w przeglądarce Firefox. Zamiast:

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

zrobić:

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

Nie tak słodki, ale jako obserwator zostanie powiadomiony natychmiast.

+1

Wymienione powyżej. –

+11

@SleepyCod: dlaczego przydałaby ci się pomocna odpowiedź? Spójrz na sygnatury czasowe. Opublikowaliśmy w ciągu 2 sekund od siebie (dosłownie, pamiętam). Oto, jak to działa: ignoruj ​​niepoprawne lub w inny sposób nieistotne odpowiedzi. –

+0

Tak, obserwuj te znaczniki czasu ... nie ma potrzeby, aby cokolwiek zrobić, również crescentfresh dodał więcej informacji do postu, nawet jeśli był to ten sam link. Tymczasem wypróbowałem kod znaleziony na tej stronie i nadal widzę problem. Może jednak coś przeoczyłem. Zaktualizowałem mój pierwotny wpis o więcej informacji ... – SeanW

13

Aktualizacja koniec 2015

Object.observe() jest teraz anulowane. Przepraszam, ludzie!

Aktualizacja 2015

użytkowania Object.observe() from ES7.

Here's a polyfill.

+0

Hm, nie mogłem zmusić tej polyfill do pracy nad ios safari. Pojawia się błąd: undefined nie jest funkcją (ocena 'Object.observe (a.imgTouch, function (a) {console.debug ("lastX:" + a)})') – infomofo

+0

@infomofo Witam, czy chciałbyś otworzyć problem na stronie projektu ze wszystkimi szczegółami, które możesz podać? Nie testowałem go na iOS, ale przyjrzę się problemowi. – MaxArt

7

Należy zauważyć, że w Chrome 36 i wyżej można użyć Object.observe również. Jest to właściwie część przyszłego standardu ECMAScript, a nie funkcja specyficzna dla przeglądarki, taka jak Mozilla Object.watch.

Object.observe działa tylko na właściwościach obiektu, ale jest dużo bardziej wydajny niż Object.watch (przeznaczony do celów debugowania, a nie do użytku produkcyjnego).

var options = {}; 

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

options.foo = 'bar'; 
2

można użyć Object.defineProperty.

oglądać nieruchomość bar w 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 
    } 
}) 
Powiązane problemy