HTML 上に記述した JavaScriptでメッセージダイアログを表示する場合、alert() や confirm() を使うことになるんですけど、単純にメッセージを表示したい場合は alert() 、二者選択(OK/キャンセル)の場合は confirm() と使い分けるわけなんです。
alert(Message);
result = confirm(Message);
ところが、そもそも alert() は注意ダイアログ、confirm() は確認ダイアログとして使用するためのメソッドなんで、表示されるアイコンが決まっています。
そこで、用途に応じてボタンの種類や表示されるアイコンを指定したい場合、Windowsに限ってですが、WSHのPopUpメソッドを使う方法があります。
WSHのPopUpメソッドはメッセージダイアログを表示させるメソッドで、ボタンの種類(OK/キャンセル や はい/いいえ等)や表示されるアイコンを指定することができます。
result = WshShellObject.PopUp(Message,wait,title,setting);
wait:自動的に閉じるまでの秒数。0を指定すると、ボタンを押すまでダイアログは閉じない。 title:ダイアログのタイトルに表示される文字。
setting:ボタンの種類やアイコンの設定値を加算した数値を指定。
これで、JavaScriptで自由にメッセージダイアログが表示できるようになります。
ところが!!
実は、この PopUpメソッドのメッセージダイアログですが、モードレスになっていて、ダイアログを閉じる前に、ダイアログを呼び出した親ウインドウにフォーカスを移したり、親ウインドウを閉じたりできてしまうのです(゚д゚*)
親ウインドウを操作されないようにすることは小細工でできるんですけど、フォーカスが移ったり親ウインドウを終了させないようにすることは、JavaScriptではできません。
JavaScriptの alert() や confirm() はモーダルダイアログなので、ボタンを押すまで親ウインドウを操作することができません。この点は alert() や confirm() に分があるようです。
これは困りました。
どうにかしてPopUpでモーダル化する方法はないかと調べていたんですが、見当たらないし思いつかない。
こうなれば奥の手だ!!
はい、実はモーダルなメッセージダイアログを出す方法があるんです。
しかしこれはJavaScript & WSH だけではできません。
あの方の手は借りたくなかったんですが、できないものは仕方がない。
そこであの方にお出ましを願いました。そのお方は・・・
VBScript
Windowsではおなじみの、かの有名なMicrosoft謹製スクリプト言語様です。w
VBScriptにはメッセージダイアログを表示させる MsgBoxメソッドがあり、そのダイアログはモーダルです。
しかも、MsgBoxメソッドはWSHの PopUpメソッドと同じように、ボタンやアイコンの指定ができ、その値も戻り値も PopUp と同じなんです。って言うか、PopUp が MsgBox を元に出来てるって言った方がいいのかな?w
「え?じゃぁ、VBScriptでソース書き直すの?」
っと思った方もいるかもしれませんが、せっかく書いてきた JavaScriptのソースを VBScript に書き直すなんて面倒ですし、わたし自身 VBScript はよくわかりません (^^;)ゞ
そこで、メインのソースは JavaScriptのままで、メッセージダイアログを表示する部分だけを VBScriptにやってもらうことにします。
HTMLでは、「<SCRIPT>タグで定義された関数(Function)は同等に扱われる」と言う、とってもありがたい仕様があります。
つまり、JavaScript でも VBScript でも、関数(Function)化してしまえば、どちらからでも呼び出せるのです。
っと言うことで、作ってみました。
<SCRIPT type="text/VBScript" language="VBScript">
function showMsgDialog(msg,mWait,mTitle,mMode)
showMsgDialog = MsgBox(msg,mMode,mTitle) end function
</SCRIPT>
<SCRIPT type="text/JavaScript" language="JavaScript">
result = showMsgDialog("ダイアログのテストです。",0,"ダイアログのテスト",64);
</SCRIPT>
メインのスクリプト側は Popup の構文になっていたので、そのまま関数名を VBScriptで作った関数名に変更しただけです。
VBScript側では、JavaScriptから渡された引数を MsgBoxメソッドにセットしてダイアログを表示。
ダイアログの戻り値(どのボタンが押されたか)を、自分自身の戻り値として JavaScript側に返しています。
引数にある mWait は関数内では使用していません。これは PopUp メソッドをこの関数に置き換えた場合、タイムアウトの時間指定をすべて削除しなくてはならなくなるので、関数名の書き換えだけで対応させるためのダミーです。
関数名だけであれば、エディタで関数名を全置換すればいいだけですからね^^
もしタイムアウト処理が必要な場合は、VBScript側に mWait の値で MsgBox と PopUp を使い分けるようなスクリプトを書いて、タイムアウト処理がいらない時だけ、MsgBox を使うようにするといいでしょう。
|