none
IE11でモーダルウィンドウからwindow.print()で印刷するとモーダルウィンドウを閉じるまで認証ダイアログが表示されない RRS feed

  • 質問

  • <背景>

    ASP.NETで開発したWebアプリで一覧画面から詳細画面を表示するなど、親画面からモーダルで子画面を出している。

    このとき、子画面(詳細画面)に設置している画面印刷ボタン(window.print()メソッドを実行)を押すと、印刷ダイアログが表示され、そこで「印刷」ボタンを押すと、次に認証ダイアログが表示され、そこでID・パスワードを入れて認証が完了すると印刷が始まる。

    このアプリはIE8では動いていたが、最近IE11にしたところ、子画面を閉じて親画面まで戻らないと認証ダイアログが表示されなくなった。

    <準備>

    [プリンタのプロパティ]で「ジョブごとに認証入力画面を表示する」ように設定をする

    ※プリンタのドライバによって設定方法が違うかもしれません

    <再現方法>

    1. 親画面からモーダルで子画面を起動する。
    2. 起動された子画面からJavaScriptのwindow.print()メソッドで画面のハードコピーの印刷指示をかける。
    3. 印刷ダイアログが表示されるので、「印刷」ボタンを押す。
    4. 本来ならば認証ダイアログ(ユーザID、パスワードなどを入力)が表示されるはずだが、表示されない。
    5. その子画面を閉じて親画面に戻ると、ようやく認証ダイアログが表示される。
    6. 認証ダイアログで認証すると子画面のハードコピーが印刷される(親画面が印刷されるわけではない)

    <サンプルソース>

    ※実際困っているのはASP.NETのWebアプリですが、以下のサンプルでも再現します。

    [parent.html]

        <script type="text/javascript">
        <!--
            function popup_modal(url){
              window.showModalDialog(
              url,   //移動先
              this,  //ダイアログに渡すパラメータ(この例では、自分自身のwindowオブジェクト)
              "dialogWidth=800px; dialogHeight=480px;"
              );
            }
        -->
        </script>
        <INPUT TYPE="button" VALUE="モーダルウインドウ" onClick="popup_modal('child.html')">

    [child.html]

        <INPUT Type="button" VALUE="印刷" onClick="window.print();">

    <環境>

    クライアントOS:Windows7 Professional SP1 (32bit)

    サーバOS:Windows Server 2003R2 SP2

    ブラウザ:IE11 (11.0.25 (KB3100773))

    プリンタ:Fuji Xerox ApeosPort-V C3375 T2

    プリンタドライバ:Fuji Xerox ART EX Print Driver Version 6.9.1

    <その他確認事項>

    1. IE9、IE9では起きない
    2. IE10、IE11の最新パッチ適用前だとフリーズする
    3. モードレスで子画面を起動すると起きない
    4. ActiveReportを使った帳票印刷では再現しない
    5. Chromeでは再現できない(モーダルが対応していない)
    6. 他社のプリンタでも恐らく再現する(ドライバそのものではなく、中で呼んでいるMicrosoftの共通メソッドが原因)

    <質問>

    上記のような、認証ダイアログが子画面を閉じるまで表示されなくなる現象を回避するいい方法はないでしょうか?

    いろいろな方法を試してみましたが、IE11のセキュリティが厳しくなったこともあり、動かなかったりします。

    要は画面のハードコピーが取れればよいのですが、Webアプリなので難儀しております。

    以上、宜しくお願いいたします。

    2015/12/24 追記

    一台しか確認できていませんが、64bitのWindows7ではうまくいきます。IEやOSに依存している可能性がますます高まりました。


    • 編集済み wakazo 2015年12月24日 0:13
    2015年12月22日 2:29

すべての返信

  • IE の更新適用状況によって動作が変わるという事であれば、IE 自体の仕様や制限が絡んでいる可能性が強いですね。どちらかと言えば有償サポートへ問い合わせた方が良さそうな案件だと思います。

    ただ昨今の Web アプリケーションでは showModalDialog は非推奨という流れなので、それを止める方がクロス ブラウザーでも動作するので望ましいのかもしれません。


    hebikuzure

    2015年12月23日 5:55
    モデレータ
  • hebikuzure様

    返信ありがとうございます。

    仰るとおりだと思います。サポートに問い合わせる前に、まずはここで質問させていただきました。

    モーダルが推奨されなくなりつつあることは承知しておりますが、以前から運用しているシステムでして、大幅な改修が発生するために、すぐには対応できずにいます。世の中の流れ的にOSをXPから7へ、IEは8から11へ余儀なくされたことにより発生したものですので、まずはIE11対応として最小限の改修でできることを模索中です。

    ちなみにブラウザも諸事情により、IE限定となりますので、今回はクロスブラウザー対応は考えておりません。

    2015年12月24日 0:25
  • ドキュメントモードを変更して試してみたでしょうか? それで効果があれば、対症療法ではありますが、問題のページに meta タグ (X-UA-Compatible) を追加することで対応してはいかがですか?


    IE11 ではエッジモードが使われており、ドキュメントモードは廃止される可能性があるとのことで、将来的には切り替えることができなくなる可能性があるそうです

    個人的には、IE での使用に限定しても問題多すぎの showModalDialog は使わないで、ASP.NET Ajax Control Toolkit の ModalPopupExtender とか jQuery UI の Dialog を使うのがお勧めですが・・・

    2015年12月24日 2:35
  • SurferOnWww様

    返信ありがとうございます。

    サンプルソースの親ウィンドウ、子ウィンドウともにhead部に<meta http-equiv="x-ua-compatible" content="IE=8" >を追加して試してみましたが、特に変化なしでした。

    上でも述べたように、改修量やテストの工数の観点から、showModalDialogを使わないように改修するのは、現時点では難しいのですが、ちょっと実験だけはしてみようと思います。


    • 編集済み wakazo 2015年12月24日 8:03
    2015年12月24日 8:02
  • > サンプルソースの親ウィンドウ、子ウィンドウともにhead部に<meta http-equiv="x-ua-compatible"
    > content="IE=8" >を追加して試してみましたが、特に変化なしでした。

    その場所が重要らしいですがその点は OK ですか?

    以下の記事によると "このヘッダーは、Web ページのヘッダー ( HEAD セクション) で、 title 要素およびその他の meta 要素以外のすべての要素の前に置く必要があります。" とのことです。

    ドキュメント互換性の定義
    https://msdn.microsoft.com/ja-jp/library/cc288325(v=vs.85).aspx


    IE11 でも F12 開発者ツールでドキュメントモードの設定はできるそうです。試すにはそちらの方が簡単だと思いますのでやってみてはいかがでしょう。(設定した meta タグが効いているかの確認も F12 開発者ツールできると思います)

    Web制作者は注意! Internet Explorer 11で変更された「互換性」
    http://www.buildinsider.net/web/ie11attention/01

    2015年12月24日 8:54
  • SurferOnWww様

    返信ありがとうございます。

    ご紹介いただいたサイトは私も確認しておりました。ご指摘の引用部分は見落としていましたが、ソースを改めて確認したところ、一番上に記述しておりました。

    「特に変化なし」という私の書き方が悪かったと思いますが、開発者ツールにつきましても、IE8モードで動作しているところまで確認しております。

    わざわざありがとうございました。

    IE11の動作テストで、最新のパッチを当てる前はフリーズしていたので、Microsoftもある程度認識している可能性があり、次のパッチあたりで治らないか淡い期待をしております。

    2015年12月25日 0:21
  • > 次のパッチあたりで治らないか淡い期待をしております。

    この手の期待を抱く開発者の方は多いのですが、Microsoft も問題を改修するかどうかはそれについての問い合わせ (特に有償サポートでの SR 数) とその問い合わせで申告された深刻度によって決められるので、「淡い期待」を抱くよりはちゃんと SR を出した方が改修される可能性は高くなります。


    hebikuzure

    2015年12月25日 11:24
    モデレータ
  • hebikuzure様

    返信ありがとうございます。

    確かにそうかもしれません。現在は、ユーザー様には運用でカバーしてもらっている状態です。

    すなわち、「ジョブごとに認証の入力画面を表示する」ではなく、「常に同じ認証情報を使用する」に設定し、予めID・パスワードを設定しておくと、認証ダイアログが毎回表示されなくなります。これを利用してプリンタの設定をユーザーの数だけ用意するようにしました。

    共有パソコンを使っているので、ユーザー様は使用するごとに通常使用するプリンタを自分用に設定したプリンタに切り替えてから印刷しています。

    しかし、これではやはり不便ですし、セキュリティとしてはあまり意味が無いのでMicrosoftに問い合わせてみることにします。

    ありがとうございました。

    2016年1月5日 1:07
  • 続報です。

    こんなところにヒントがありました。

    https://support.microsoft.com/ja-jp/kb/2582307

    IEを起動する際に、-nohangrecovery のオプションを指定して起動すると回避できました。

    Microsoftから正式な回答をいただくまでは暫定策という認識にとどめております。

    2016年1月7日 8:00