вот моя проблема
Я генерирую файл Excel в функции PHP (с Zend Framework 2). Иногда процесс генерации может быть длинным, слишком длинным (25 секунд и более), поэтому я решил создать модальную структуру для отображения загрузчика, чтобы пользователь не растерялся.
Я пытаюсь с помощью Jquery узнать, когда файл Excel генерируется и загружается, чтобы я мог скрыть загрузчик. Файл генерируется простым нажатием на ссылку:
<a href="linkToGenerateMyExcelFile">Download excel file</a>
Следующий код генерирует и загружает файл Excel, но не позволяет мне знать, когда это будет сделано:
$(function() {
$(document).on('click', ".btn-export", function(event){
event.preventDefault();
$("#myModal-export .loader").removeClass("hide");
var url = $('.btn-export').attr("href");
$(location).attr("href", url);
});
});
Есть ли способ узнать, когда ссылка полностью загружена?
На самом деле, я понятия не имею.
Для вашего PHP-файла, который создает ваш файл Excel, вы захотите создать base64-файл, а затем вернуть путь к файлу завершенного файла, например, так …
<?php
$writer = new \PHPExcel_Writer_Excel5($workbook);ob_start();
$writer->save('php://output');
$xls = ob_get_contents();
ob_end_clean();
echo 'data:text/xls;base64,' . base64_encode($xls);
?>
для вашего JS вы хотите сделать AJAX-вызов get, а когда файл возвращается, сразу же выведите файл в тег и добавьте его куда угодно. Вы могли бы также window.location = data
но это не добавляет имя файла. Я также попытался вызвать клик на теге, но это тоже не сработало.
$(function() {
$(document).on('click', ".btn-export", function(event){
event.preventDefault();
$("#myModal-export .loader").removeClass("hide");
var url = $(this).attr("href");
$.get(url, function( data ) {
$("#myModal-export .loader").addClass("hide");
$a = $("<a>", {href: data, download: 'file_name.xls'});
$a.text('Download');
$('body').append($a);
});
});
});
Если вы загрузите свою страницу создания Excel с помощью функции jQuery.ajax () или jQuery.load (), вы можете использовать соответственно функцию «success» или функцию обратного вызова, чтобы узнать, что процесс завершен, и перейти к следующему шагу. Вот как это сделать с помощью функции load (), если ваш модал имеет идентификатор myModal:
$('#myModal').load('path-to-excel-generator.php',function() {
// code to be executed after completion
});