現在開いているウィンドウがダイアログか判定する

IEでは昔からshowModalDialog、showModelessDialogを使ってダイアログを表示できるのだが、何でこう適当な仕様になってしまったのか window.open とAPI仕様に互換性がまるでなく、ダイアログ特有の不具合も多々ある。

  • window.opener で親ウィンドウを取得できない
    • showModalDialog/showModelessDialogの第二引数にwindowを渡すか、window.returnValue で値を戻すて親側で処理するかの二択
  • POSTできない
    • <base target="_self"> を書くと解決する
  • でも、<base target="_self"> を書くとダウンロードしたときにダウンロードダイアログがでない
    • iframe に対してPOSTすると解決する

本当は使いたくないのだが、業務アプリでは使わざるを得ない場合もある。これだけ仕様が異なるにも関わらず開かれた側から自分がダイアログであることを示すプロパティがほとんどなく苦労していたのだが、次の一文で判定するのが良いようである。

"dialogArguments" in window

showModalDialogに関しては、最近 Firefox/Chrome 共にサポート済みとなっている。が、Firefoxのダイアログには、ダウンロード時にダイアログがバグるという問題がありこれは今のところ回避不能Chromeのダイアログはモーダルにならない。

それにしてもIEというのは変なブラウザだ。大量のバグがある割に回避方法もなぜか用意されている。どういう設計をしているのだろう。