Как запустить JavaScript функцию после завершения скачивания файла

Ситуация с загрузкой Excel файлов

У меня есть две старые ASP страницы: поиск.asp с формой поиска и результаты.asp для отображения данных. На странице поиска есть выпадающий список для выбора формата результатов.

<form method="post" action="результаты.asp">
    <select name="formatType">
        <option value="html">HTML</option>
        <option value="xlsx">Excel</option>
    </select>
    <input type="submit" value="Найти" />
</form>

Когда пользователь выбирает Excel формат, страница результатов устанавливает:

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader "Content-Disposition", "attachment; filename=данные.xlsx"

Проблема

Запросы обрабатывают до 15000 записей и выполняются около полутора минут. Пользователь видит сообщение “Обработка данных…” но не знает когда загрузка закончится.

Что нужно

Мне нужно запустить JavaScript код когда файл полностью скачается, чтобы скрыть индикатор загрузки. Как это можно реализовать?

function hideLoadingMessage() {
    document.getElementById('loadingIndicator').style.display = 'none';
    alert('Файл успешно загружен!');
}

Есть ли способ отследить момент завершения скачивания и вызвать эту функцию?

Обычные формы тут не помогут - браузер не может отслеживать момент завершения загрузки файла. Лучше всего было бы переписать на AJAX с использованием blob, но если менять ASP страницы нельзя, можно использовать скрытый iframe. Отправляешь форму в iframe, а затем вешаешь обработчик на его событие load, которое сработает, когда файл будет готов. После этого можно убрать индикатор загрузки.

Попробуй использовать fetch вместо обычной формы. Отправь запрос через fetch, получи blob, создай ссылку для скачивания и скрой индикатор загрузки. Так ты точно узнаешь, когда загрузка завершится. Старые ASP страницы всё еще работают или их нужно переделывать?

Делал точно такое год назад для больших отчётов. XMLHttpRequest с responseType=‘blob’ - работает как часы! Заменяешь submit на xhr, получаешь blob, создаёшь ссылку через URL.createObjectURL() и кликаешь программно. В onload прячешь индикатор. Только ASP код чуть подправить нужно для CORS заголовков.