イベント処理( 2 )
最終更新日:

前へ 目次 次へ

 前回に引き続きイベント処理に関する食えない事情で、 今回はイベントオブジェクトについてです。


 前回採り上げた 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 ShinSoftAll rights reserved.