122

Object.Watchとは両方とも現在非推奨になっていることに注意してくださいObject.Observe(2018年6月現在)。


オブジェクトまたは変数の変更を監視する簡単な方法を探していましたがObject.watch()、Mozillaブラウザーではサポートされていますが、IEではサポートされていないことがわかりました。それで私は誰かが何らかの同等のものを書いたかどうかを確かめるために周りを探し始めました。

私が見つけたのはjQueryプラグインだけですが、それが最善の方法かどうかはわかりません。私は確かにほとんどのプロジェクトでjQueryを使用しているので、jQueryの側面については心配していません...

とにかく、質問:誰かがそのjQueryプラグインの実用的な例を見せてもらえますか?私はそれを機能させるのに問題があります...

または、クロスブラウザで機能するより良い代替案を知っている人はいますか?

回答後に更新

回答ありがとうございます!ここに投稿されたコードを試してみました: http ://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

しかし、IEで動作させることができなかったようです。以下のコードはFirefoxでは正常に機能しますが、IEでは何も機能しません。watcher.statusFirefoxでは、変更されるたびにdocument.write()inwatcher.watch()が呼び出され、ページに出力が表示されます。IEでは、これは発生しませんが、最後の呼び出しで正しい値が表示されるため(IEとFFの両方で)watcher.status、値が更新されていることがわかります。document.write()しかし、コールバック関数が呼び出されない場合、それは一種の無意味です... :)

私は何かが足りないのですか?

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>");
4

8 に答える 8

114

(クロスポストについては申し訳ありませんが、同様の質問に対して私が与えたこの回答は、ここでは問題なく機能します)

少し前に小さなobject.watchシムを作成しました。IE8、Safari、Chrome、Firefox、Operaなどで動作します。

于 2009-08-13T05:32:43.933 に答える
20

そのプラグインは、単にタイマー/間隔を使用して、オブジェクトの変更を繰り返しチェックします。たぶん十分かもしれませんが、個人的にはオブザーバーとしてもっと即時性を求めています。

watch/unwatchをIEに取り込む試みは次のとおりです: http ://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html 。

オブザーバーを追加するFirefoxの方法から構文を変更します。それ以外の :

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

あなたがやる:

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

それほど甘くはありませんが、オブザーバーとしてすぐに通知されます。

于 2009-06-22T21:16:33.277 に答える
16

この質問への答えは少し時代遅れです。Object.watchObject.observeはどちらも非推奨であり、使用しないでください。

現在、Proxyオブジェクトを使用して、オブジェクトに加えられた変更を監視(およびインターセプト)できるようになりました。基本的な例は次のとおりです。

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'

ネストされたオブジェクトに加えられた変更を監視する必要がある場合は、専用のライブラリを使用する必要があります。Observable Slimを公開しましたが、次のように機能します。

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}}]
于 2018-06-14T05:04:59.947 に答える
13

現在の回答

ターゲットへの変更を監視できる新しいProxyオブジェクトを使用します。

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

2015年からの古い答え

ES7のObject.observe()を使用することもできます。これがポリフィルです。ただし、Object.observe()はキャンセルされました。ごめんなさい!

于 2013-06-27T14:54:22.510 に答える
7

Object.observeChrome 36以降では、同様に使用できることに注意してください。これは実際には将来のECMAScript標準の一部であり、Mozillaのようなブラウザ固有の機能ではありませんObject.watch

Object.observeオブジェクトのプロパティでのみ機能しますが、パフォーマンスははるかに高くなりますObject.watch(これは、本番環境での使用ではなく、デバッグを目的としています)。

var options = {};

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

options.foo = 'bar';
于 2014-07-16T12:27:29.783 に答える
4

Object.definePropertyを使用できます。

でプロパティbarを見る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
  }
})
于 2017-01-20T15:03:34.380 に答える
1

私は自分のプロジェクトの1つでWatch.jsを使用しました。このライブラリを使用する主な利点の1つは、次のとおりです。

「Watch.JSを使用すると、開発方法を変更する必要はありません。」

例を以下に示します

//defining our object however we like
var ex1 = {
	attr1: "initial value of attr1",
	attr2: "initial value of attr2"
};

//defining a 'watcher' for an attribute
watch(ex1, "attr1", function(){
	alert("attr1 changed!");
});

//when changing the attribute its watcher will be invoked
ex1.attr1 = "other value";
<script src="https://cdn.jsdelivr.net/npm/melanke-watchjs@1.5.0/src/watch.min.js"></script>

これはこれと同じくらい簡単です!

于 2018-12-10T12:05:56.443 に答える
-2

また、現時点で最善の解決策はWatch.JSを使用することだと思います。ここで、すばらしいチュートリアルを見つけてください。Javascriptでのオブジェクトまたは配列の変更をリッスン/監視します(Javascriptオブジェクトのプロパティ変更イベント)

于 2013-07-14T15:33:30.597 に答える