Я использую <iframe>
(я знаю, я знаю,...) в своем приложении (одностраничное приложение с ExtJS 4.2) для загрузки файлов, потому что они содержат много данных и могут занять некоторое время сгенерируйте файл Excel (мы говорим что угодно от 20 секунд до 20 минут в зависимости от параметров).
Текущее состояние вещей: когда пользователь нажимает кнопку загрузки, он "перенаправляется" на Javascript (window.location.href = xxx
) на страницу, выполняющую экспорт, но так как это делается в PHP, и никакие заголовки не отправляются, браузер постоянно загружает страницу, пока файл не будет загружен. Но он не очень удобен для пользователя, потому что ничто не показывает ему, все ли он загружается, выполняется (за исключением загрузки файла) или проваливается (что приводит к тому, что страница фактически перенаправляется, что может заставить его потерять работу, которую он выполнял).
Итак, я создал небольшое немодальное окно, закрепленное в нижнем правом углу, которое содержит iframe, а также небольшое сообщение, чтобы успокоить пользователя. Мне нужно, чтобы иметь возможность обнаруживать, когда он загружен, и иметь возможность различать два случая:
- Нет данных: OK = > Закрыть окно
- Текстовые данные: Сообщение об ошибке = > Отобразить сообщение пользователю + Закрыть окно
Но я пробовал все 4 события (W3Schools doc), и ни один из них не был когда-либо. Я мог бы хотя бы понять, что если это не вернет HTML-данные, возможно, он не сможет запустить событие, но даже если я заставляю ошибку возвращать текстовые данные, он не запускается.
Если кто-нибудь знает о решении для этого или альтернативной системе, которая может поместиться здесь, я все уши! Спасибо!
EDIT: Добавлен код iframe. Идея состоит в том, чтобы получить лучший способ ее закрыть, чем setTimeout
.
var url = 'http://mywebsite.com/my_export_route';
var ifr = $('<iframe class="dl-frame" src="'+url+'" width="0" height="0" frameborder="0"></iframe>');
ifr.appendTo($('body'));
setTimeout(function() {
$('.dl-frame').remove();
}, 3000);