none
onbeforeunloadイベントが1操作で2回呼ばれます。 RRS feed

  • 質問

  • OSはWindows7、ブラウザはIE11での動作について、不具合か否か、またアップデート等で解決済みかについて教えてください。
    確認したい動作は、onbeforeunloadイベントが1操作で2回呼ばれる動作についてです。

    onbeforeunloadイベントが設定されているウェブページで一度ブラウザ右上の×ボタンを押し「このページから移動しますか。」のメッセージを表示させ「ページにとどまる」を選択した後、ファイルダウンロードを行うサーブレットの呼び出しを行った際にonbeforeunloadが2回呼ばれ、結果、メッセージが2回出力されました。

    一度も×ボタンを押さない場合は、メッセージは1回しか出ません。また、Edgeでは同一の操作を行った場合でもメッセージは1回しか表示されません。このことから、本事象が発生する操作時のメッセージの出力は1回であることが正常な動作と思われます。

    本事象はIE側の不具合でしょうか。すでにアップデート等で解決済みであればそのアップデート内容を教えていただけるとありがたいです。


    よろしくお願いします。



    下記に事象が発生するソースを記載します。

    【HTMLのソース】
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>Sample</title>
    <script type="text/javascript">
    window.onbeforeunload = function() {
        return "メッセージ表示";
    }
    </script>
    </head>
    <body>

    <form action="※サーブレットのアドレス" method="post">
    <input type="submit" value="Download">
    </form>


    </body>
    </html>

    【サーブレットのソース抜粋】
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       OutputStream out = null;
       InputStream in = null;
    try{

    response.setContentType("text/html");
           response.setHeader(
                   "Content-Disposition",
                "attachment; filename=\"" + "test.txt" + "\"");
        response.setHeader("Cache-Control", "private");
        response.setHeader("Pragma", "");
            
               in = new FileInputStream("※ダウンロード用ダミーファイル");
               out = response.getOutputStream();
               byte[] buff = new byte[1024];
               int len = 0;
               while ((len = in.read(buff, 0, buff.length)) != -1) {
                   out.write(buff, 0, len);
               }
    }finally {
           if (in != null) {
               try {
                   in.close();
               } catch (IOException e) {
               }
           }
           if (out != null) {
               try {
                   out.close();
               } catch (IOException e) {
               }
           }
    }
    }

    2017年3月2日 7:32