Можно ли перехватить событие браузера File Open / Save, используя Javascript - PullRequest
17 голосов
/ 16 ноября 2010

Используя Javascript, можно прослушивать события диалогового окна открытия / сохранения файла браузера. Я хочу выполнить действие, когда я получаю уведомление о том, что теперь открыто диалоговое окно сохранения файла. В частности, я хочу скрыть загрузчик, когда открывается диалоговое окно (но это вполне может быть любое другое действие)

Я полагаю, что могу сделать это для создаваемого диалогового окна, но не уверен, что это можно сделать для стандартного диалогового окна браузера.

Любые указатели для этого были бы очень полезны.

Ответы [ 3 ]

12 голосов
/ 04 декабря 2012

Да! Вы можете воспользоваться тем, что большинство браузеров (все в порядке на Chrome, Firefox и IE) запускают событие beforeunload непосредственно перед открытием диалога загрузки отдельных файлов.

Так что код, подобный этому, будет работать:

$(window).bind ("beforeunload",  function (zEvent) {
    // PERFORM DESIRED ACTIONS HERE.
    /* This code will fire just before the Individual-file Download 
       dialog opens.
       Note that it will also fire before the tab or window is closed, 
       but that should not be a problem for this application.
    */
} );


Откройте и запустите этот фрагмент, чтобы увидеть его в действии:

$(window).bind ("beforeunload",  function (zEvent) {
    $("#dwnldStatus").text ("This code runs just before the file open/save dialog pops up.");
} );

$("#directDwnload").click ( function () {
    fireDownload ();
} );

$("#ResetTimer").click ( function () {
    $("#dwnldStatus").html (
        'Download will start in <span id="timeleft">3</span> seconds.'
    );
    fireTimer (3);
} );

function fireDownload () {
    window.location.assign (
        "//phs.googlecode.com/files/Download%20File%20Test.zip"
    );
}

function fireTimer (secondsLeft) {
    this.secondsLeft    = secondsLeft || 30;
    this.countdownTimer = this.countdownTimer || null;

    if ( ! this.countdownTimer) {
        this.countdownTimer = setInterval ( function() {
                this.secondsLeft--;
                $("#timeleft").text (this.secondsLeft);
                if (this.secondsLeft <= 0) {
                    clearInterval (this.countdownTimer);
                    this.countdownTimer = null;
                    fireDownload ();
                }
            },
            1000
        );
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<p>Activate one of the download buttons.  The timer button is just like any other javascript initiated download, no additional  click is needed.</p>
<p>The javascript detects when the File/Save dialog pops up and changes the status to "This code runs just before the file open/save dialog pops up.".</p>
<p>Note that it is not necessary to download the file. You can cancel the download.</p>

<div id="dwnldStatus"></div>
<button id="ResetTimer">Set timer to 3 seconds.</button>
<button id="directDwnload">Download the file now.</button>

Обратите внимание, что beforeunload также будет срабатывать до закрытия вкладки или окна, поэтому планируйте соответственно. Это не должно быть проблемой для этого вопроса, как указано.

9 голосов
/ 16 ноября 2010

Нет, для этого нет событий.

0 голосов
/ 16 ноября 2010

Просмотр всех элементов, которые могут вызвать файл диалога.

Например, обрабатывать события клика на элементах <input type="file" />. что-то вроде:

$('input:file').click(function(){ // onclick of file input
    $('.spinner').hide(); // hide spinner
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...