技 巧 鍵 盤 | ─ KeyNavi:キーボードを活用してホームページを快適に─ |
■ キー割当表示[Shift-H] |
ホーム KeyNavi対応方法 [0] JavaScript@Keynavi.Netトップ [1] イベントハンドラの登録 | ・サイトマップ [Shift-S] |
後者の方法では既にイベントハンドラが登録されている場合に 既存のものを上書きしてしまう問題があります。 例えば <body onmousedown="oldfunc()">などとHTML内で 既に指定がある場合 これによって上書きされてしまうため 「oldfunc()」は実行されないことになります。
また第三者の作ったJavaScriptモジュール内で 「window.onload=oldfunc;」という記述がある場合も同様です。
そこで「kl_addhandler()/delhandler()」 という関数を用意しました。以下のような特徴があります。
- | HTMLタグ内 及び他のスクリプトで予め指定されたハンドラを上書きせず。 新たに追加するものと合わせ両方動く。 |
- | ブラウザの種類に関わらずハンドラ関数の第一引き数には
「event」オブジェクトが入る。 (New!)
Netscpae4,6,7,Mozilla系ブラウザだけでなく IE,Operaでも第一引き数をイベント
オブジェクトとして扱えます。
|
- | ハンドラ関数に任意個数の引き数を渡せる。 (New!)
通常のハンドラ関数はイベント引き数しか無く
タイマー利用時と同じく変数の退避先に困る場合があります。
詳しくは ハンドラ関数の引き数指定機能を使ってみる (このページ内)。
|
- | 関数の代わりに実行文字列を渡すこともできる。 (New!)
→処理内容をHTMLのタグ内の記述と同じようにも書けます。 |
- | 関数内では「this」で登録先のHTML要素を参照できる。 (New!)
MozllaのaddEventListener()はOKですが
IE5+のattachEvent()では「this==window」となっているので「this」が使えません。
|
- | 追加したハンドラは削除できる。 |
- | Netscape4の場合はcaptureEvents/releaseEventsを内部で実行してくれる。 自分で記述する必要が無い。 |
- | kl_hashandler()でハンドラ関数が登録済みかどうか確認できる。 |
- | クロスブラウザ。
IE4-6、NS4,6,7、Opera6-7、Mozilla。
|
具体的には以下のケースで効果的です。
- | 誰か別の人が作ったJavaScriptが既にあり自分が作ったものと両方動かしたい。 その時に既存のHTML、スクリプトは書き替えたくない。 |
- | 機能をモジュール化し各モジュール内で独立してイベントハンドラを登録したい。 |
- | デザイン(HTML,CSS)とロジック(JavaScript)を分離したい。
デザイナーには当該タグでid指定のみしてもらえばJavaScriptからもハンドラが
「追加」登録できる。デザイナーとプログラマーが同時並行で仕事を進められる。
|
「kl_addhandler()」では イベントハンドラを追加するたびに 当該要素の属性として関数や引数情報を保持します。 イベント発生時には登録された全てのハンドラ関数が実行されます。
もし「kl_addhandler()」を実行した時点で 別のJavaScriptモジュールやタグ内記述によるハンドラ指定があっても それらは内部的に保持され並行実行されるのでOKです。
上の実行ボタンを押した後、ページ内をクリックしてステータスバーを 見てみてください。 マウス座標が表示されるはずです。
次はハンドラが上書きされてないか確かめてみましょう。 KeyNaviでは「自動モード(G/T)」の実行を 任意キー以外にマウスクリックでも停止できるようにしています。 「T(戻る)」「G(進む)」を押して自動モードにし ページ内の任意位置をマウスクリックしてみて下さい。
自動モードの停止とマウス位置の表示の両方が実行されるはずです。
これらにハンドラを指定したい場合、 「kl_addhandler()」を使えばKeyNaviのハンドラ関数は上書きされません。
一方、既にハンドラ指定を含むJavaScriptコードがある場合は KeyNaviの指定 <script language="javascript" src=".../keynavi_ja.js"></script> をそれらの後に置きます。
そうすると KeyNaviのハンドラ関数は後から追加される形になるので 既存スクリプトとKeyNaviの両方が動作してくれます。 よく分からない場合は KeyNaviのタグ指定を 全ての既存スクリプトの後に置くようにすれば無難です。 殆どのブラウザでは</html>の後ろにおいても 動作します。
ハンドラ関数内から上記以外のオブジェクトにアクセスしたい場合 大域変数を用意したり 個別にハンドラ関数を作ったりという 手間がかかるのが普通です。
上の例では 「lay1」「lay2」をクリックしたら 「lay0」の背景色がそれぞれ 赤、青に変わります。
ハンドラ関数「f()」はイベントオブジェクト「evt」以外に 「lay」「color」を引き数として受け取り そのまま背景色を変更をしています。
一般的な方法では ハンドラ関数「f()」に対し 引き数としてイベントオブジェクトしか渡せません。 その結果 関数内から変更対象の「lay0」や変更色「color」を参照できません。 そのため これらをグローバル変数にするなど 回り道が必要になります。 特に同じような組合せが任意個数、任意変数ある場合には対応がメンドウになります。
「kl_addhandler()」の引き数指定機能はこのようなケースで 特に有効です。 レイヤーのドラッグ設定・解除:kl_drag_set() ,レイヤークリックで手前に移動:kl_raise_set() ではレイヤーObjectを渡すのに使っています。
画像が無い部分をクリックした場合は 関数内からのレイヤー参照に「this」が使えるのですが 画像上をクリックした時は「this」が画像になるため 困ります。 そこでハンドラ関数登録時にレイヤーオブジェクトを引き数として渡しています。
【JavaScript@Keynavi.Net :
一般イベント処理編
】
「Ctrl-矢印」でフォーカスを上下左右に移動できます。
|
トップへ戻る [1] | Back[Q] ・Top[W] ・Up[E] ・PgUp[R] ・Focus[Ctrl-矢印] |
ホーム KeyNavi対応方法 [0] JavaScript@Keynavi.Netトップ [1] イベントハンドラの登録 | ・サイトマップ [Shift-S] |
■ キー割当表示[Shift-H] | ─ KeyNavi Project 2003 ─ |