javascriptによる定期的な自動処理の解除

タイトルではわかり難い。

ユーザースクリプト(GreaceMonkeyなど)や、ブックマークレットを使う際の話。

例えば

こんな風に定期的に処理のIDを変数にとっていない場合の、定期処理の解除方法。

setInterval(function(){ 
    // なんか定期的に処理
  }, 
  1000 // なんとなく1秒
);

ってケースや、prototype.js使ったときは以下のようになるでしょう。

new PeriodicalExecuter(function(){
    // なにか定期的に処理
  },
  1000
);

って感じ。

困るとき

あるページが上の例のように、定期的に処理をしています。しかし、「この定期処理は要らない。解除したい」って時困る。
通常、後で解除する時は

// 定期処理の設置 
var id = setInterval(function(){ 
    // なんか定期的に処理
  }, 
  1000 // なんとなく1秒
);
 ・
 ・ 
 ・
// 定期処理の解除
clearInterval(id);

として解除を行う。


が、例の場合だと整数を保存していないので解除となるIDがわからないで解除できない。。。

解法

性質として以下の二点が挙げられる。

  • IDは概ね連番で割り当てられる。(ただし、5から始まったり、1から始まったりとマチマチ)
  • IDは保存して無くても、当てずっぽうでヒットしても解除できる。

ので、

var maxID = 10;

for(var i=0; i<maxID; i++){
  clearInterval(i);
}

とすれば、ページにセットされた自動処理を解除できる。
これはprototype.jsのPeriodicalExecuterでセットされたモノも同じ処理で解除できる。


ただし、セットされた自動処理の数が多いと、maxID=10じゃ足りないかも。
ちょっと複雑になるけどコウするべきかな?

var maxID = setInterval(function{});

for(var i=0; i<=maxID; i++){ // 終了条件が「<」から「<=」になってるのに注意
  clearInterval(i);
}


以上です。
個人的レポートでした。


追記: どうやらこれはIEには使えないみたいですね。変わりに以下の様にするしか手がなさそう。

var maxID = setInterval(function{});
var foo = 20 //maxIDからfoo個のIDを解除する。

for(var i=maxID-foo; i<=maxID; i++){ 
  clearInterval(i);
}

fooの値は沢山セットされていたら大きな値にしないとイケナイ感じ。
気持ち悪。


素敵なブラウザ独自のメソッド無いかな?