Object.watch () visoms naršyklėms?

Nepamirškite perskaityti visų toliau pateiktų komentarų. Object.Watch ir Object.Observe yra pasenę. Žr. Elliott B komentarą apie atnaujintą (nuo 2018 m. Birželio mėn.) Metodą.


Aš ieškojau paprasto būdo stebėti objektą ar kintamąjį pakeitimams, ir aš rasiu „ Object.watch() , kuris yra palaikomas „Mozilla“ naršyklėse, bet ne IE. Taigi pradėjau ieškoti, ar kas nors parašė lygiavertį.

Vienintelis dalykas, kurį radau, buvo jQuery įskiepis , bet nesu įsitikinęs, ar tai yra geriausias būdas. Aš, be abejo, naudoju jQuery daugelyje mano projektų, todėl jQuery aspektas manęs nerūpi ...

Bet kokiu atveju, kyla klausimas: ar kas nors man gali parodyti šio jQuery įskiepio darbo pavyzdį? Turiu problemų su šiuo ...

Ar kas nors žino kokias nors geresnes alternatyvas, kurios veiks tarp naršyklių?

Atnaujinti po atsakymų :

Ačiū visiems už atsakymus! Bandžiau čia paskelbtą kodą: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Bet aš negalėjau dirbti su IE. Toliau nurodytas kodas puikiai veikia „Firefox“, tačiau IE nieko nedaro. „Firefox“, kiekvieną kartą watcher.status , watcher.status yra vadinamas document.write() watcher.watch() ir galite pamatyti rezultatą puslapyje. IE to nepavyksta, bet matau, kad watcher.status atnaujina vertę, nes paskutinis skambutis į document.write() rodo teisingą vertę (tiek IE, tiek FF). Bet jei atšaukimo funkcija nėra vadinama, tai beprasmiška ... :)

Ar kažką praleidau?

 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>"); 
114
22 июня '09 в 23:29 2009-06-22 23:29 SeanW nustatė birželio 22 d. , 09:29 , 2009-06-22 23:29
@ 9 atsakymai

(Atsiprašome už kryžminį paštą, bet šis atsakymas, kurį daviau panašiam klausimui, puikiai veikia čia)

Keletą metų sukūriau nedidelį objektą . Jis veikia IE8, „Safari“, „Chrome“, „Firefox“, „Opera“ ir kt.

112
13 авг. atsakymą pateikė Eli Grey 13 rug. 2009-08-13 08:32 '09 8:32 am. 2009-08-13 08:32

Šis įskiepis paprasčiausiai naudoja laikmatį / intervalą, kad pakartotinai patikrintų objekto pakeitimus. Galbūt gana gerai, bet asmeniškai norėčiau gauti daugiau tiesioginės informacijos kaip stebėtojas.

Čia yra bandymas unwatch watch / unwatch IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html .

Ji keičia sintaksę „Firefox“, pridėdama stebėtojus. Vietoj:

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

Jūs:

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

Ne taip saldus, bet kaip stebėtojas tuoj pat pranešate.

18
23 июня '09 в 0:16 2009-06-23 00:16 atsakymas pateikiamas „ Crescent Fresh“ birželio 23 d., 09:16, 08-06-23 00:16

Dabartinis atsakymas

Naudokite naują proxy objektą, kuris gali stebėti jos tikslinius pokyčius.

 let validator = { set: function(obj, prop, value) { if (prop === 'age') { if (!Number.isInteger(value)) { throw new TypeError('The age is not an integer'); } if (value > 200) { throw new RangeError('The age seems invalid'); } } // The default behavior to store the value obj[prop] = value; // Indicate success return true; } }; let person = new Proxy({}, validator); person.age = 100; console.log(person.age); // 100 person.age = 'young'; // Throws an exception person.age = 300; // Throws an exception 

Senas atsakymas nuo 2015 m

Galite naudoti Object.observe () iš ES7 . Čia yra polifilis. Tačiau Object.observe () dabar yra atšauktas . Atsiprašome žmonių!

11
27 июня '13 в 17:54 2013-06-27 17:54 atsakymą pateikė mikemaccana birželio 13 d., 17:54, 2013-06-27 17:54

Atsakymai į šį klausimą yra šiek tiek pasenę. Object.watch ir Object.observe yra pasenę ir neturėtų būti naudojami.

Šiandien galite naudoti tarpinį objektą stebėti (ir perimti) objektui padarytus pakeitimus. Čia yra pagrindinis pavyzdys:

 var targetObj = {}; var targetProxy = new Proxy(targetObj, { set: function (target, key, value) { console.log('${key} set to ${value}'); target[key] = value; } }); targetProxy.hello_world = "test"; // console: 'hello_world set to test' 

Jei reikia stebėti įterptinio objekto pakeitimus, turite naudoti specializuotą biblioteką, pvz., „ Observable Slim“, kuris veikia taip:

 var test = {testing:{}}; var p = ObservableSlim.create(test, true, function(changes) { console.log(JSON.stringify(changes)); }); p.testing.blah = 42; // console: [{"type":"add","target":{"blah":42},"property":"blah","newValue":42,"currentPath":"testing.blah",jsonPointer:"/testing/blah","proxy":{"blah":42}}] 
10
14 июня '18 в 8:04 2018-06-14 08:04 atsakymą pateikė Elliot B. Birželio 14 d., 08.08 val

Atminkite, kad „Chrome“ 36 ir naujesnėse Object.observe galite naudoti „ Object.observe . Tiesą sakant, tai yra būsimo ECMAScript standarto dalis, o ne specifinė naršyklės funkcija, pvz., „Mozilla Object.watch .

Object.observe veikia tik su objektais, tačiau yra daug efektyvesnis nei Object.watch (kuris skirtas derinimo tikslams, o ne naudoti gamyboje).

 var options = {}; Object.observe(options, function(changes) { console.log(changes); }); options.foo = 'bar'; 
6
16 июля '14 в 15:27 2014-07-16 15:27 Atsakymą Husky davė liepos 16 d. 14, 15:27 2014-07-16 15:27

Galite naudoti Object.defineProperty .

peržiūrėti bar nuosavybę 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 } }) 
2
20 янв. atsakymas, kurį pateikė souparno majumder Jan 20 2017-01-20 18:03 '17, 18:03 2017-01-20 18:03

Viename iš savo projektų naudoju Watch.js . Ir tai veikia gerai. Vienas iš pagrindinių šio bibliotekos naudojimo privalumų yra:

„Su Watch.JS, jūs neturite keisti vystymosi būdo“.

Toliau pateikiamas pavyzdys.

Tai taip paprasta!

1
10 дек. Atsakymą pateikė NIKHIL CM, gruodžio 10 d. 2018-12-10 15:05 '18, 15:05 2018-12-10 15:05

Radau du žmones, kurie teigia, kad išsprendžia šią problemą:

Peržiūrėkite „Crossbrowser“ objektus (parama „IE“, „Opera“, „Safari“)

žiūrėti () IE nėra „JS“ funkcijos naudojant „prototype.js for IE“ (? Opera, Safari?)

1
23 июня '09 в 0:16 2009-06-23 00:16 atsakymas pateikiamas „ Jitter“ birželio 23 d., 09:16, 2009-06-23 00:16

Taip pat manau, kad dabar geriausias sprendimas yra naudoti „Watch.JS“, rasti gerą pamoką čia: klausytis / sekti „Javascript“ objektų ar masyvų pakeitimus („Javascript“ objektų įvykio modifikuotas įvykis)

-2
14 июля '13 в 18:33 2013-07-14 18:33 atsakymą pateikė „ FidEliO “ liepos 14 d. 13 d. 18:33 2013-07-14 18:33

Kiti klausimai apie „ etiketes arba „ Užduoti klausimą“