但し、その変数やオブジェクトプロパティが配列などの"オブジェクト"を有している場合は、検出しません。クロージャとは言え参照渡しは変わらないためですが、それでもオブジェクトまで監視したい場合は string へパースするように改変の必要があります。
json 関数などの有用な関数は多いので改造は容易だと思います。
ただ、パースまでしていると遅くなる可能性が非常に高いです。なので軽いオブジェクトに限定するか、チェックサムの様なものにする方が良いと思います。
■ 確認環境
ie 6.0, 7.0
ff 3.0
ま、確認環境は少ないですが、環境に依存しやすいものは使ってないのでほとんどの環境で動くでしょう。
■ 同日追記(ローカル変数を監視する場合)
この関数の場合、ローカル変数の監視は出来ませんが、以前書いた。
Javascipt:関数ごとに終了状態をトレースしてゆく関数
を応用すれば可能です。あまり深く考えてませんがw
※ ただし、この場合は対象の関数が終了した後にしか、検出できません。
ソース
function onChangeValue(obj, nam, cbf, _tm){
if(!_tm) _tm = 100;
var f = function (o, n){
var v = o[n];
var t = setTimeout(
function (){
clearTimeout(t);
if(v != o[n]){
if(cbf(o, n)){
f(o, n);
}
}else{
f(o, n);
}
},
_tm
);
}
f(obj, nam);
}
if(!_tm) _tm = 100;
var f = function (o, n){
var v = o[n];
var t = setTimeout(
function (){
clearTimeout(t);
if(v != o[n]){
if(cbf(o, n)){
f(o, n);
}
}else{
f(o, n);
}
},
_tm
);
}
f(obj, nam);
}
使い方
・ グローバル変数の場合
onChangeValue(window, 'val', callBack);
val と言う変数があった場合、上記サンプルのようにすると val の値が変わった際に関数 callBack が呼ばれます。
callBack には、window と 'val' が渡されます。
・ オブジェクトの場合
onChangeValue(obj, 'nam', callBack);
オブジェクトとプロパティ名と call back を渡します。
・ call back 例
function callBack(o, n){
alert(o[n]);
return true;
}
o : 監視しているオブジェクト
n : 監視しているプロパティ名
上記例では変更後の値を alert します。
※ call back が true を返すと引き続き変数の監視を続けます。
※ ソース中の v を callBack に渡すように改変すれば変更前の値を受け取れます。
・ 監視の間隔を変更する
onChangeValue(obj, 'nam', callBack, 100);
オプションの第4引数にミリ秒単位で監視の間隔を指定します。
サンプル
この記事へのコメント