■キー割当表示 [Shift-H] ─ KeyNavi:キーボードを活用して 
ホームページを快適に─
 
ホーム [0] JavaScriptバグ&回避法リスト:1.目次 [1] 4. イベント(キー入力)編 ・サイトマップ [Shift-S]

JavaScriptバグ&回避法リスト
 ■ 4. イベント(キー入力)編

 ■ 4.1 accesskeyの動作がブラウザ毎に異なる

リンクやフォームの各オブジェクトに対し HTMLで「accesskey="キー名"」を指定することにより ショートカットキーを設定できます。 しかしながら この動作はブラウザ毎に異なります。 例えばリンクの場合、 IE4,NS6,7では該当ページへ移動、IE5,5.5,6.0ではフォーカスのみ設定されます。 一方でフォームのsubmitボタンやresetボタン等では クリックが実行されます。 その結果accesskeyの利用ではブラウザ間、オブジェクト間で動作を揃えられず ユーザが混乱します。

実験&アクセスキーの動作確認状況

この他に「accesskey」による指定では以下の点に注意する必要があります。
「ALT-F」(=ファイル)などメニューバーへの既存のショートカットを上書きする
メニューに使われているキーはブラウザ毎に異なります。 IE4.0(FEVGAH)、IE5.0-6.0(FEVATH)、NS6.0(FEVSGBTH)、 NS7.0&Mozilla1.2(FEVGBTWH) など若干バラツキがあります。 これらのブラウザのショートカットを避ける場合は 「ABEFGHSTVW」を使わないようにします。
環境によっては「ALT」の代わりに「Ctrl(MacIE5.0)」「Shift-Esc(Opera7)」を使う等 操作方法が異なる。ページ内でブラウザ毎に使い方を説明する必要がある。
NS4,Opera6では動かない

KeyNaviではブラウザ間差異を吸収し 拡張APIにより 「ALT」だけでなく「Ctrl」「Shift」を組合わせたショートカットを作成できます。 また拡張関数を用いてキーの複数回入力(履歴ショートカット)も実装できます。

配列「KL_KEY2XXX」を使う、 リンク文字列から自動算出する、 idやnameにより指定する3種類の指定方法があります。
動作にはページ内・ページ間移動、 フォーカス、クリック、関数実行を指定できます。
キーイベント処理の工夫(<JavaScript@Keynavi.Net)

 ■ 4.2 Flashにfocusするとキー入力無視(各ブラウザ)

殆どのブラウザではFlashオブジェクトを クリックしたりしてフォーカスすると ALTやCtrlを使ったブラウザのショートカットを除けば 矢印キー,PageUpDown,BackSpaceも含め殆どのキー入力を無視するようです。 (IE4,5,6、NS4/6.1/7.0,Opera6など。)

その結果スペースや矢印キーによるスクロールができません。 キーボードで操作するユーザが混乱する可能性があります。

またTabキーによるFocus位置の移動もFlashの所で止まってしまいます。

この時「きぃなび」も動作しません。
大きなFlashオブジェクトを配置するときには注意が必要です。 Flash中心のページを作成する時はスクロールの必要の無いページに しておくといいでしょう。

不安定バージョンと揶揄される NS6.0だけはスペースや矢印キーも解釈されスクロールなどできます(苦笑)。 通常はFlashの外をクリックしてフォーカスを解除する必要があります。

【Flashオブジェクトをクリックして実験】

KeyNaviの「Ctrl-矢印」によるフォーカス移動機能ではFlashをFocus先にしません。

Ctrl-上下矢印など実際に入力して試してみて下さい。

 ■ 4.3 event.preventDefault()が動作せず(Opera6)

キーイベントは通常 「document.onkeydown」「document.onkeypress」「document.onkeyup」に対して イベントハンドラを設定して処理します。
(Netscape6以上ではdocument.addEventListener()を使います。)
(Netscape4ではdocument.captureEvents()も併せて実行します。)
この時 NS6+やOpera6+では「e.preventDefault()」(e=イベントオブジェクト) によって ブラウザのデフォルトのイベント処理をさせないことができます (はずです)。 ところがOpera6(Win版、Linux版)では上記を実行しても無視されます (キー入力について、onclickは動作)。 そのためOpera6のショートカットが実行されます。

追記:Opera7.0ではきちんと動作します。

 ■ 4.4 keydown,keyup時のキーコードが特殊(IE4+)

キーイベントに対し発生するキーコードは NS4.x,NS6+で「e.which」 IE4+,Operaでは「event.keyCode」で得られます。 IE4+では アルファベットと数字以外のキーは「keydown,keyup」時のキーコードが 特殊なものになっています。 例えばファンクションキーですが キーネームに直して解釈すると 「F1(q)〜F11(z)、F12({)」となっています。

ちなみにこの時 「Q-Z」キーなどを押すと こちらは小文字ではなく大文字になるので原理上 両者の区別はできます。

一方、一般の記号については 「`」が「`」が頭に付く「A」になったり ドイツ語やフランス語で出てきそうなアルファベットが返されます (キーコードが拡張アスキーコードつまり128以上256未満のものになっています)。

イベントテストページで実験

KeyNaviでは内部的な仕組みでこの問題に対応し 開発者側でこれらの問題を考慮する必要が無いよう工夫しています。 ショートカットや拡張関数の作成では ブラウザ間差異を考慮せず 単一の短いコードで各ブラウザに対応できます。

 ■ 4.5 keypress時のキーコードが特殊(Opera6)

Win版Opera6ではkeypress時のキーコードの扱いに注意が必要です。 入力キーが「I」までのアルファベットの場合にはキーネームが数字キーと一致 (「A(1)〜I(9)」)します。 またそれ以外の入力ではイベントが無視されたりします。

一方、keydown時には正しく処理されるのでそちらで対処します。 逆に記号([]/;)などはkeypress時のみに正しく解釈されるので keypress時に処理します。

Linux版Opera6.10、Win版Opera7.0では全てkeypress時に処理できます。

イベントテストページで実験

先の項目と同じく、KeyNaviでは内部的な仕組みでこの問題に対処しています。

 ■ 4.6 修飾キー(Ctrl,ALT,Shift)の扱い(各ブラウザ)

修飾キーが押されたかどうかは イベントオブジェクト「e」に対し「e.altKey,ctrlKey,shiftKey」 (NS4ではe.modifiers)を使って判定できます。 しかしながら 修飾キーが押された場合、 特にCtrlキー(コントロールキー、MacではOptionキー)やALTキーについては 注意が必要です。
例えば「Ctrl-J」を入力した場合に得られるキーネーム(kn)は
IE4+:keydown,keyup時に「kn='J'」、keypressで「kn='\\n'」(改行コード)
NS4.x:全ての場合で「kn='\\n'」(改行コード)
NS6+:keydown,keyup時に「kn='J'」、keypress時に「kn='j'」
となっています。 また Opera6ではショートカットが設定されていて 「Links in frame」というウィンドウが立ち上がります。

一方「ALT」キーの場合も 「Ctrl」と同じくショートカットに使われることが多い (「ALT-F」が「ファイルメニュー」)など扱いには特別な配慮が必要です。

イベントテストページで実験

KeyNaviでは拡張キー名「knx」というものを定義して この問題に対応しています。 全てのブラウザ、イベントで 「J→"J"」「Ctrl+J→"cJ"」「Ctrl+Shift+J→"csJ"」などと 統一した記述でショートカットや拡張関数を作成できます。

 ■ 4.7 keypress時にShiftを判定できない(NS6)

Win版NS6.0,6.1等ではkeypress時に「Shift-F」などの入力があっても 「Shiftキーが押されていることを判別できないようです (「e.shiftKey」がfalseになる)。

keydown時に「Shift」が押されているか確認し それを内部変数として保持してkeypress時に反映するなどとして対応しています。

イベントテストページ(上記には内部で対応済みです)





ページの先頭へ     

前のページへ
次のページへ
JavaScriptバグ&回避法リスト 目次 【数字キーでアクセス】
例 : 「2.1節」は「2」キーを2回連打して移動。「Q or P」で戻る。
「Ctrl-矢印」でフォーカス移動。
1. 目次
2. 基本編
3. イベント(一般)編
4. イベント(キー入力)編
4.1 accesskeyの動作がブラウザ毎に異なる
4.2 Flashにfocusするとキー入力無視(各ブラウザ)
4.3 event.preventDefault()が動作せず(Opera6)
4.4 keydown,keyup時のキーコードが特殊(IE4+)
4.5 keypress時のキーコードが特殊(Opera6)
4.6 修飾キー(Ctrl,ALT,Shift)の扱い(各ブラウザ)
4.7 keypress時にShiftを判定できない(NS6)
5. レイヤー編
6. その他


ホーム [0] JavaScriptバグ&回避法リスト:1.目次 [1] 4. イベント(キー入力)編 ・サイトマップ [Shift-S]
■キー割当表示 [Shift-H] ─ KeyNavi Project 2003 ─