| |
最終更新日: |
前へ | 目次 | 次へ |
---|
前回に引き続きイベント処理に関する食えない事情で、 今回はイベントオブジェクトについてです。
前回採り上げた onLoad イベントなどは、 そのイベントが発生した詳細な情報が必要になるケースは殆どありません。
マウスやキーに関連するイベントでは 「何処で」とか「何が」とかいった情報を積極的に利用する必要があります。然し、IE と NN では、イベントの扱い方が全く異なります。
IE ではイベントに関する情報は全て window.event オブジェクトで 一括管理されますが、 NN では定義したイベントハンドラに対するインターフェイスとして渡されます。
私には IE の構造は問題があるように見えます。 つまり、イベントハンドラとして定義した処理が重い場合、
「イベント抜けが発生する」と宣言しているように見えるのです。
実験のためにこんなスクリプトを書いてみます。
<script language="JavaScript1.1"><!-- col = new Array( '#000000', '#111111', ... , '#FFFFFF' ); cnt = 0; function heavyProcedure(){ documnt.f.t.value=++cnt; for(var i=0; i<col.length; i++) document.bgColor=colors[i]; } // --></script> <form name="f"> <a href="" onmouseover="heavyProcedure();">It's heavy!</a> <input type="text" name="t"> </form>これを実行して「It's heavy!」の文字の上でマウスを撫でると、 NN では onmouseover 発生した数だけテキスト領域に表示されるカウンタが 増加しますが、 IE では実際の操作数より少なくなります。
つまり、NN ではイベントに関する情報は Event オブジェクトを生成して 各ハンドラに渡しているのに対して、 IE ではイベントの受け付けで状態更新をするだけで、 ハンドラへの通知が非同期処理されているようにみえます。
この IE の構造はインタラクティブな処理をする際、 致命的な問題になる可能性があります。
例えば、よくあるスクリプトに onmouseover/onmouseout でリンクの表示を変えるものがありますが、 素早くマウス操作をすると onmouseover の表示状態が残る現象になって現れます。この問題の回避策は、スクリプトに優先処理の概念がないため、根本的な手法は ないと思います。せいぜい
- 1)
- イベント処理を複雑にしない。
- 2)
- 上記の例のように対になる表示がある場合、タイマなどにより最終状態を確認する処理を入れる。
程度でしょうか。
NN はしょ〜もないバグが多いのですが、
IE は仕様上のバグが多いのです。 f(^^;
次回も引き続きイベント処理についての食えない事情の予定です。
前へ | 目次 | 次へ |
---|
Copyright(c) 1999 ShinSoft |