JQuery Throbber при обработке большого файла - PullRequest
0 голосов
/ 17 декабря 2010

В моем веб-приложении пользователь может сгенерировать файл CVS, который иногда может получить довольно большие 10+ Мб. Создание отчета может занять некоторое время. Я хочу отображать пульсатор для пользователя во время создания отчета, после того как ему будет предложено сохранить / запустить, я хочу, чтобы пульсатор скрылся. Возможно ли это?

Ответы [ 3 ]

1 голос
/ 18 декабря 2010

Нет, на самом деле невозможно определить, когда файл прибывает и пользователь сохраняет его.Вы в значительной степени застряли, просто обновив свой пульсатор и предложив ссылку продолжения, когда они будут готовы продолжить.

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

0 голосов
/ 18 декабря 2010

Я предполагаю, что вы публикуете некоторые данные, генерируете CSV на сервере, устанавливаете тип контента и ждете появления диалогового окна сохранения браузера. Правильно?

В таком случае, я думаю, вы будете разочарованы. Я потратил довольно много времени, пытаясь найти события, которые сработали бы для этого точного сценария, и я не мог понять это. В конце концов мне пришлось сделать что-то замысловатое, например, использовать XHR для опроса статуса создания файла. Получив ответ, который я хотел, я спрятал пульсатор и запросил CSV.

Для ясности:

  • Показать пульсировщик
  • Используйте XHR, чтобы сообщить серверу о начале генерации CSV
  • Использование XHR для опроса статуса создания CSV
  • После завершения создания файла:
    • добавить невидимый iframe в документ, который указывает на вновь созданный CSV, и заставить сервер добавить к нему заголовок размещения содержимого.
    • Спрятать пульсатор после небольшой задержки (вы можете попытаться рассчитать его так, чтобы пульсатор был скрыт после отображения окна сохранения файла, но пока пользователь взаимодействует с окном). Вы также можете обнаружить событие размытия окна, чтобы скрыть пульсатор, но я уверен, что это не очень надежно.
0 голосов
/ 17 декабря 2010

Да, обычно тяжелые операции в JavaScript делятся на куски и затем вызываются из setInterval Тайм-аут удерживает страницу от зависания.

var csvTxt = "";
var isDone = false;
addPart = function(){
    csvTxt += addTextFromLongCalculation();
    if(csvTxt > 10000000) isDone = true; // this is an arbitrary example
}

var handle = setInterval(function(){
   addPart();
   if(isDone){
        clearInterval(handle);
   }
}, 20);
...