2

HTMLページがあり、ページ上のファイルリンクをクリックすると、ファイルダウンロードダイアログがポップアップし、このファイルダイアログがページをロックします。つまり、選択肢([開く]、[保存]、[キャンセル])のいずれかを選択しないと、ページ上で何もできません(これは正常です)。私が必要としているのは、javascriptがページがロックされているかどうかをチェックできるかどうかです。(またはファイルダイアログがポップされるかどうか?)

サーバーの応答が非常に遅い場合があるため(クリック後30秒など)、psは「リンクにonclickイベントを配置する」とは言いません。

4

2 に答える 2

3

サーバーがダウンロード用のファイルを返していることがわかっている場合は、次の回りくどい方法でダイアログがいつ表示されるかを推測できます(これは、私が尋ねた関連する質問に対するスタックオーバーフローの回答から得たものです)。

  1. ページから HTTP リクエストを発行するとき、値がランダムな文字列であるパラメーターを追加します ("random" + new Date().getTime()安全である必要はないが、衝突を回避したいなど)。

  2. サーバーはそのパラメーターを探します。ダウンロード用の添付ファイルの返送を開始すると、ランダムな文字列を値として Cookie が追加されます。

  3. ここで、ページが HTTP 要求を発行した後、インターバル タイマーを開始します。タイマー関数のコードは、document.cookieそのランダムな文字列を探してチェックします。その文字列が含まれているとすぐにdocument.cookie、HTTP 応答がブラウザーに到達したことがわかります。ブラウザーがユーザーに添付ファイルの保存を要求することがわかっているので、その時点でファイル ダイアログが表示されていると推測できます。

私がこれを必要としたのは、直接のユーザーの「クリック」以外のイベントからの添付ファイルに関する IE のセキュリティに対処する方法でした。モーダル ダイアログを閉じる必要があったため、HTTP 応答がいつ返されるかを知る必要がありました。

于 2010-04-02T13:10:26.643 に答える
1

ページがロックされているため、JavaScript では何もできません。これもロックされているためです。

しかし、あなたは何をしようとしていますか?ユーザーがファイルをダウンロードしているという事実を何らかの方法でログに記録しようとしていますか? はいの場合、それを行うためのより良い方法があり、それらはサーバー側にあります。サーバー側のスクリプト言語を使用してファイルを提供し、ダウンロードされたという事実をログに記録します。

それがあなたがやろうとしていることではない場合、唯一の方法はonclickリンクまたはonunload/のいずれかを使用するonbeforeunloadことですが、これらは信頼性が低く、ブラウザーごとにまったく異なる動作が見られると確信しています。

実は、そういえばもう一つ方法があるのですが、とても汚いです。アイデアは、毎秒実行する間隔を設定し、2 つの実行の間に 1 秒以上経過したかどうかを確認することです。何かのようなもの:

var lastTime = new Date().getTime();
function checkTime() {
    var curTime = new Date().getTime();
    if (curTime - lastTime > 1100) { // 1100 because there might be small browser lags 
        // do something after the dialog appeared and the user did something with it
    }
    lastTime = curTime;
}
setInterval(checkTime, 1000);

そのダイアログが開いている間、ページをブロックしないブラウザー (Chrome がその例だと思います) があるため、これが機能しない可能性があることに注意してください。これを使用する場合は、すべてを再確認してください。

私は今シャワーを浴びに行かなければなりません。

于 2010-04-02T11:49:15.760 に答える