<?xml version="1.0"?> <?xml-stylesheet type="text/css" href="chrome://global/skin/"?> <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <label value="Hello." /> </dialog>
ちなみに同じように記述をwindow要素で行うと次のようになり、
<?xml version="1.0"?> <?xml-stylesheet type="text/css" href="chrome://global/skin/"?> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <label value="Hello." /> </window>
これは次のように表示されます。
ダイアログに表示するボタンを定義します。表示される位置は、ユーザーのプラットフォームに依存します。
buttons属性を指定しないと、既定のボタンが表示されます。
Windowsでの既定
表示するボタンを変更するには、buttons属性に下表の定数を指定します。
値 | Windowsでの表示 | 対応するイベント |
---|---|---|
accept | OK | ondialogaccept |
cancel | キャンセル | ondialogcancel |
help | ヘルプ | ondialoghelp |
disclosure | 詳細情報 | ondialogdisclosure |
extra1 | 任意の機能 | ondialogextra1 |
extra2 | 任意の機能 | ondialogextra2 |
複数のボタンはカンマ区切りで指定します。このとき表示順は自動で決定されるため、記述する順番は無関係です。
<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" buttons="accept,cancel,help,disclosure,extra1,extra2" buttonlabelextra1="SAMPLE1" buttonlabelextra2="SAMPLE2">
ダイアログのボタンは、
var acceptButton = document.documentElement.getButton( 'accept' );getButton - XUL | MDN
のようにボタン名を指定することで、スクリプトから取得できます。
accept (OK) ボタンが押されたときに呼ばれます。このハンドラを抜けると通常ダイアログは閉じられますが、ハンドラがfalseを返すとそれを阻害します。
<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" ondialogaccept="return doOK()"> <script type="application/x-javascript"><![CDATA[ function doOK( e ) { if( ! window.confirm( 'OK?' ) ) { return false; } } ]]></script> </dialog>
ちなみにこのコードは、DOMイベントリスナを用いると、
<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript"><![CDATA[ function doOK( e ) { if( ! window.confirm( 'OK?' ) ) { e.preventDefault(); } } window.addEventListener( 'dialogaccept', doOK, false ); ]]></script> </dialog>
のように書き換えられます。
cancel (キャンセル) ボタン、または閉じるボタンが押されたときに呼ばれます。ハンドラからfalseを返すことで、ondialogacceptと同じ挙動を示します。
openDialog()はopen()を拡張したものです。挙動は基本的に同じですが、引数のfeaturesがサポートするパラメータと、追加の引数を受け取る点に違いがあります。
newWindow = window.openDialog( url // ウィンドウで読み込むURL [, name] // ウィンドウの名前 [, features] // [, arg1] [, arg2] [, ... ] )window.openDialog - Web API reference | MDN
urlとnameはopen()と同様です。featuresも基本的にopen()と同様ですが、下表の項目が追加で使用できます。
項目 | 説明 | 設定値 |
---|---|---|
all | yesのとき、初期状態でアクティブとする | yes、no |
open()と同様、openDialog()で開かれたウィンドウも既定でモードレスですが、featuresで'modal'を指定することでモーダルにできます。このパラメータを指定するのに制約はなく、この点はUniversalBrowserWrite特権を必要とするopen()と異なります。
たとえば、
<?xml version="1.0"?> <?xml-stylesheet type="text/css" href="chrome://global/skin/"?> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <label value="Hello." /> </window>
のXUL文書をそれぞれのメソッドから呼び出すと、次のように表示されます。
open() | openDialog() |
---|---|
openDialog()のargN引数で、開いたウィンドウに任意の値を渡せます。開かれた側のウィンドウでは、その値をwindow.argumentsで取得できます。
逆に開いたウィンドウからデータを受け取るには、openDialog()の戻り値から開いたウィンドウのプロパティへアクセスします。そのためには必ず'modal'を指定し、モーダルウィンドウとして開く必要があります。
var data1 = 123;
var url = 'chrome://myPackage/content/sample.xul';
var dialog = window.openDialog( url, '', 'modal', data1 );
dialog.data2; // 'ABC'が返される
開かれる側 [chrome://myPackage/content/sample.xul] のコードは、次のようになります。
<?xml version="1.0"?> <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script> var data2 = 'ABC'; // 返す値 if( window.arguments && ( 0 < window.arguments.length ) ) { var data1 = window.arguments[ 0 ]; // 123が渡される } </script> </dialog>
argN引数で関数を渡せば、開かれた側から開いた側を操作することも可能です。
また引数でオブジェクトを渡せば、そのオブジェクトのプロパティを介することで、データの受け渡しがより簡単に行えます。Returning values from the dialog - Window.openDialog - Web API Interfaces | MDN
windowオブジェクトのopenerプロパティで、開いたウィンドウ (Windowオブジェクト) を取得できます。よってこのプロパティを介せば、開かれた側から能動的に開いた側を操作できます。