フォームの監視とCPU負荷についてのちょっとした考察

WEB アプリの話。prototype.js の PeriodicalExecuter には、動的に時間間隔を変更できる仕組みが必要だと思う。

DOM のイベントには onchange っていうのがあって、こいつはフォームになんか入力されて変更があると起こる。じゃあユーザの入力をキャッチして何かしたいってときはこれ使えばいいじゃんと思うんだけど、実はこの change イベントはユーザの入力が終わった後*1に発行されるヤツだから、例えば emacs のインクリメンタル検索みたいな用途には使えない。残念。

prototype.js にはちゃんとこういうときのためのクラスがあって、 Form.Observer か Form.Element.Observer を使うと定期的*2にフォームの内容を監視できる。ハッピー!

で、こっからが本題なんだけど、監視対象がすげーいっぱいあると、ユーザはただボーっとしてるだけなのにすげーいっぱいの Observer 達ががんばって「変更あったかな?まだかな?あら、まだだ」なんてやることになる。これは無駄に CPU 資源を使うだけで何も良いことがない。監視対象のフォームにフォーカスが合ったときだけ変更監視ループが動いて、そうじゃないときはなにもしないように設定できるとよりハッピーになれる。

Form.Observer と Form.Element.Observer は Abstract.TimedObserver というのを親クラスとしてて、定期的に実行する仕組みはさらにこれの親クラスである PeriodicalExecuter に書いてある。これに手を入れて動的に時間間隔を変更できるようにすれば、フォーカスが合ったときだけ頻繁に監視するっていう仕組みが作れるんじゃないかなと思う。

んだけど、誰かもうやってそうな気がする。てか他にもっといいやりかたがあるかもしれない。

*1:具体的にはinputやtextareaからフォーカスが外れたときとか

*2:0.5秒毎とかに監視すればキー入力に追従してるように見えるわけ