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の値は沢山セットされていたら大きな値にしないとイケナイ感じ。
気持ち悪。
素敵なブラウザ独自のメソッド無いかな?