window.showModalDialog
はモーダルウィンドウを開くためのメソッドです。
2016年11月現在、Chromeでは廃止され、Firefox50では使えますが非推奨です。
Firefoxでもそのうち廃止する予定だそうです。
https://developer.mozilla.org/ja/docs/Web/API/Window/showModalDialog
window.showModalDialog
を使っている機能で、結構不具合がありましたので、
window.showModalDialog
を使う上での注意点を挙げていきます。
ちなみに、今のところ全てIEです。
そもそもwindow.showModalDialog
使わなければいいんですが、代替方法とか考えると、これまた不具合が出そうでして。。。
モーダルウィンドウ上でsubmit
IE11では、 モーダルウィンドウ上でsubmitすると、別ウィンドウが開かれてしまいます。
Firefox50では起こりませんでした。
form要素のtarget属性値と、window.name
を一致させれば、別ウィンドウは開きません。
form要素のtarget属性は、submit後の開き方を指定する属性です。
<form method="POST" action="/sample" target="modalWindow">
window.name="modalWindow";
http://hotmemin.com/blog/?p=615
http://html5.cyberlab.info/elements/forms/form-target.html
親ウィンドウへのアクセス
IE11では、モーダルウィンドウ内から親ウィンドウへのアクセスが、window.opener
でできません。
Firefox50ではwindow.opener
でアクセスできました。
モーダルウィンドウにwindow
オブジェクトを渡せば、window.dialogArguments
でアクセスできます。
window.showModalDialog("modal.html", window, "");
var parent = window.opener || window.dialogArguments;
http://d.hatena.ne.jp/replication/20100117/1263694945
http://d.hatena.ne.jp/sngmr/20080729/1217319827
optionsのdialogWidth
,dialogHeight
には単位が必要(IE11)
以下のコードを実行すると、Firefox50では200pxのウィンドウ幅で開かれますが、IE11では画面幅最大で開かれます。
window.showModalDialog("modal.html", window, "dialogWidth=200");
下記のように長さの単位を付ける必要があります。
window.showModalDialog("modal.html", window, "dialogWidth=200px");
optionsのdialogHide
,edge
, status
, unadorned
はIE専用
下記サイトを参考にしてください。
http://help.dottoro.com/ljdlgxbu.php
IE8ではウィンドウをキャッシュしている
IE8ではwindow.showModalDialog
で複数回ウィンドウを開いたとき、正しく動きませんでした。調べてみたら、2回ウィンドウを開いたとき、JSPの初期処理が実行されていません!
そう、キャッシュされていました。
キャッシュさせないよう、URLにランダム値を付与するか、metaタグでキャッシュしないよう指定すれば、解決できます。
Seleniumで操作できない
テスト自動化できません。
対応方法は、window.showModalDialog=window.open
を実行して、モードレスウィンドウに強制的に変更することです。
https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/284
http://stackoverflow.com/questions/4304886/webdriver-showmodaldialog