

JavaScriptを使用してサーバーにあるファイルにアクセスし、そのファイルをクライアントのexeで開くプログラムを作っています。

概ね期待通りの動作はできているのですが、サーバーのファイルにアクセスするところでブラウザ(IE9)の通知バーが表示されてしまいます。これを表示させずにexeを起動させなければならないのですが、回避する方法が分からなくて困っています。  
(通知バーとは、ブラウザの画面下部に表示される [開く] [保存] [キャンセル]を選択するもののことです)

コードは下記の様になっています。sample.cgiの呼び出しが成功したら"result.myext"を開くという処理です。

[code]

    new Ajax.Request("sample.cgi", {
        method:"post",
        parameters:"param=123",
        onSuccess:function() {
            window.location.href = "result.myext";
        }
    });
    
[/code]

通知バーが表示されてしまうのは、onSuccessで処理をした場合に起きており、例えば、`window.location.href =
"result.myext"` を `new Ajax.Request`
の手前に書いた場合には、通知バーが表示されることなくexeが起動してきます。従いまして、MIMEやレジストリの設定に誤りは無いと思っています。

なぜ、onSuccessではできないのか、何か解決の手法をご存知の方がいらしたらご教授をお願い致します。

なお、実行クライアント(Windows 7)には、拡張子"myext"についてレジストリに下記の設定が済んでいます。

  * 実行するexeの関連付け
  * EditFlags 65536
  * BrowserFlags 8

また、apacheのhttpd.confには、MIME "myext"について下記の設定が済んでいます。

[code]

    AddType application/myext .myext
    <FilesMatch "\.myext$">
        Header set Content-Disposition inline
    </FilesMatch>
    
[/code]

補足

  * 実行クライアントは、Windows 7以降。ブラウザはIE9以降に限定しています。
  * WindowsXPとIE8では、IE9での通知バーに相当する、実行・保存ダイアログを表示させることなく動作していました。
  * 他の方法として、タイマーでsample.cgiが成功するのを監視しresult.myextを開くということを試しましたが、通知バーが表示されてしまいました。
  * apacheのMIME設定は、無くても関連付けられたexeは起動できる様です。
  * サーバーはWindows Server 2008 R2、 Apache 2.0.65
  * prototype.jsのバージョンは、1.5.0を使用しています。

以上、何卒よろしくお願い致します。


CC BY-SA 3.0
2016-01-26T05:45:31.690
21319
2016-08-07T04:55:49.433
2016-08-01T12:46:27.667
8000
14138
question
javascript windows ajax internet-explorer
ファイルのダウンロード時にIEの通知バーを表示させたくない


Ajax.Request の外側で window.location.href を実行した場合は通知バーが表示されないという理解で間違いないでしょうか。  
そうであれば HTTP ヘッダーやクライアントのレジストリ設定は問題ないですね。  
ajax の別のリクエスト
コンテキスト内でページ遷移をしようとしているのでセキュリティ的な理由から通知バーが表示されているというような想定ができますが、この辺りは
prototype.js の実装に依存する動作なのですぐにはっきりとしたことが言えないです。  
実験的にこの部分だけでも prototype.js を使わない実装で試してみてください。


CC BY-SA 3.0
2016-07-30T07:41:06.750
27964
2016-08-07T04:55:49.433
2016-08-07T04:55:49.433
30
3598
21319
answer


「ボタンクリックなどのユーザー操作によって起動された処理」なのかどうかが問題のような気がします。有名どころだと、 ブラウザによっては
`$('input[type="file"]').click()`
がclickイベント内でないと実行できないという話があります。（現時点で手元のPCブラウザでは再現できませんでしたが、[この記事](http://codepen.io/anon/pen/RRBXBL)や[この記事](http://bobobo.bona.jp/blog/?p=43)で言及されている内容です）

今回ご質問の、また[無償公開されているIE9の仮想マシン](https://developer.microsoft.com/en-us/microsoft-
edge/tools/vms/)や手元のIE11でも確認できた

  * clickイベント内では動作する
  * 他のイベント（mouseoverなど）、XHR（Ajax）のイベント、setTimeout等では動作しない

という現象はこの問題とよく似ているように思います。

IE11では `<meta http-equiv="refresh" ...>`
とだけ書いたページを経由することで回避できましたが、IE9ではこれでも通知バーが出てしまうようでした。`asynchronous: false`
オプションを使って同期通信にするという手はありますが、レスポンスを取得するまでメインスレッドをブロックすることになりますから、できれば避けたいところです。

Ajax通信を行わずいきなりリダイレクトしてしまうか、Ajax完了時はダウンロードリンクを表示するだけに留めるか、といったあたりをまずはご検討ください。


CC BY-SA 3.0
2016-08-01T13:34:43.110
28004
2016-08-01T13:34:43.110
8000
21319
answer