2009年04月24日

javascript:変数を監視する関数

変数やオブジェクトプロパティの値を監視して変更があった際に callback を起動する関数です。watch の無い ie でも監視します。

但し、その変数やオブジェクトプロパティが配列などの"オブジェクト"を有している場合は、検出しません。クロージャとは言え参照渡しは変わらないためですが、それでもオブジェクトまで監視したい場合は 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);
}


 使い方


・ グローバル変数の場合
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引数にミリ秒単位で監視の間隔を指定します。

サンプル





posted by HiFa at 01:43 | 🌁 | Comment(0) | TrackBack(1) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする
>>> スパムコメントは消してますよん。 お互い無駄な労力は避けましょう。 <<<

この記事へのコメント

コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

Javascipt:関数ごとに終了状態をトレースしてゆく関数
Excerpt: 関数の状態をトレースする関数。変数の終了時の状態や arguments などを蓄積します。関数内の変数は簡易的にスキャンして、一括取得できるようになっています。
Weblog: Script雑感
Tracked: 2009-04-24 14:10