- PR -

javaScript ポップアップ画面を最前面表示制御したまま tabキーの操作を可能にしたい

1
投稿者投稿内容
tomo
常連さん
会議室デビュー日: 2004/07/31
投稿数: 20
投稿日時: 2004-10-13 22:21
いつもお世話になっております。
java初心者(javaScriptも初心者)のtomoです。

現在webアプリケーションを作成中なのですが、ポップアップで表示する画面の制御
で困っています。
行いたいことは以下の2つです。

 ☆ポップアップ画面は常に最前面に表示させる
 (他の画面上でマウスポインタをクリックしてもその画面を前に表示せず、ポップアップ画面
  を前に表示させておく)
 ☆ポップアップ画面内の要素(ボタン等)は、TABキーを使って選択可能とする

以上2つの要件を実現するため、ポップアップ画面のjspを以下のように
記述してみました。

<html>
<head>
<title>window close test</title>
<script language="JavaScript">
<!--
var prevElem;
function focusWin() {
if (document.activeElement != prevElem) {
prevElem = document.activeElement;
} else {
window.focus();
}
}
// -->
</script>
</head>
<body onLoad="focusWin();" onBlur="focusWin();" name="window1">
<form>
<input type="button" name="button1" onClick="window.close();" value="閉じる" onBlur="focusWin();">
</form>
</body>
</html>

これで実行すると、TABキーの操作は可能になりますが、画面内の要素ではない部分
(アドレスバー等)が選択されている状態の時 最前面表示できません。
初期表示時、ボタンがTABで選択されている時は最前面表示ができますが、それ以外が
選択されてしまうと、作成したfocusWin()が呼び出されず、画面制御できないようです。
実際のポップアップ画面では、ボタン以外のテキスト要素等も含まれていますが それらは
TABキーの選択対象外としたいため、focusWin()が呼び出されず最前面表示できない状態です。
どうにか☆の2つの要件を満たしたものを作りたいのですが、何か良い方法はないでしょうか?
javaScript等に詳しい方、是非ご教授お願いいたします。


[ メッセージ編集済み 編集者: tomo 編集日時 2004-10-13 22:23 ]
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2004-10-13 23:49
こんばんは。

JAVAの件ではないようで・・・

document.activeElement;が記されているということは、IE限定ですね?

それならば、showModalDialogで良いのではないでしょうか?

http://www.microsoft.com/japan/developer/library/jpisdk/dhtml/references/methods/showModalDialog.htm

tomo
常連さん
会議室デビュー日: 2004/07/31
投稿数: 20
投稿日時: 2004-10-14 11:56
torakiyojpさん ありがとうございます。
JAVAの件ではないです。すいません。他に適当な掲示板が見つからなかったので
とりあえず 藁をもすがる思いで投稿いたしましたm(_ _)m
ご指摘いただいた通り、IE限定です。
ポップアップを呼び出す 呼び出し元画面で 
window.open()としていたところを、window.showModalDialogに変えてみたところ、
簡単なサンプルでは、期待通りの動作を実現できました!
ただ、実際作成したいアプリケーションの画面では、window.openの引数のURLのところに
いろんな値を詰めているためか、どうも期待通りの動作になりません。
TABキーの操作はできるようになるのですが、ポップアップ画面を常に最前面に表示してくれ
ません。
ポップアップ画面の方で画面制御する方法は何かないでしょうか?
tomo
常連さん
会議室デビュー日: 2004/07/31
投稿数: 20
投稿日時: 2004-10-14 11:56
torakiyojpさん ありがとうございます。
JAVAの件ではないです。すいません。他に適当な掲示板が見つからなかったので
とりあえず 藁をもすがる思いで投稿いたしましたm(_ _)m
ご指摘いただいた通り、IE限定です。
ポップアップを呼び出す 呼び出し元画面で 
window.open()としていたところを、window.showModalDialogに変えてみたところ、
簡単なサンプルでは、期待通りの動作を実現できました!
ただ、実際作成したいアプリケーションの画面では、window.openの引数のURLのところに
いろんな値を詰めているためか、どうも期待通りの動作になりません。
TABキーの操作はできるようになるのですが、ポップアップ画面を常に最前面に表示してくれ
ません。
ポップアップ画面の方で画面制御する方法は何かないでしょうか?
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2004-10-14 23:32
こんばんは。

> TABキーの操作はできるようになるのですが、ポップアップ画面を常に最前面に表示してくれません。

正直、わからないですね。showModalDialogを使えば、呼び出し元画面はロックされるという認識でしたが、ロックされない場合があるのですね。


> ポップアップ画面の方で画面制御する方法は何かないでしょうか?

onblurとfocus()を組み合わせる程度しか思い浮かびません。

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-10-15 00:33
window.showModalDialogとwindow.openは別物です。
URLのパラメータの概念は同じですので
サーバ側の処理では全く同じになります。

しかしクライアントに処理が移ると
window.openと同じクライアントの処理では
不具合が起こる可能性は高くなります。

また、showModalDialogでは呼び出し元の画面はロックできますが、
他のアプリケーション(IE以外も含む)のロックまではできません。
しかし、showModalDialogで開かれた画面のonBlurイベントで
その画面に再フォーカスをあてるのは可能です。
ただし、[win] + [D]を押したり、[alt] + [tab]とかやると
100%再フォーカスはできません。
tomo
常連さん
会議室デビュー日: 2004/07/31
投稿数: 20
投稿日時: 2004-10-15 13:07
torakiyojpさん、かつのりさん ありがとうございました。
やりたい事を100%対応するのは難しいという事がよくわかりました。
ひとまず
☆ポップアップ画面は常に最前面に表示させる の対応を

<body onload="focus();" onblur="focus();" onContextmenu="return false">

でしておいて、tabキーの操作可能にする対応は保留する事にします。
また 対応方法が見つかり次第ご報告させていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)