2013-11-01 5 views
1

У меня есть веб-приложение, в котором пользователи могут экспортировать результаты, нажав на кнопку. Насколько я знаю, что это не представляется возможным инициировать файл «загрузить» с JavaScript, поэтому я использую простой сервер путешествие туда и обратно, чтобы начать загрузку:получить статус отправки формы из javascript

  1. Пользователь нажимает на кнопку экспорта
  2. создает некоторые Javascript скрытая форма поле, содержащее данные, которые я хочу в файле
  3. подчиненной формы запускается
  4. серверами принимает данные формы и отправляет его обратно пользователю в виде файла
  5. файл загрузки запускается

Поскольку загрузка данных может занять некоторое время, я меняю текст на кнопке экспорта на «готовую загрузку» после шага 1. Где-то вокруг шага 4 или 5 я хочу изменить кнопку на нормальное. Есть ли способ узнать, когда браузер начинает получать ответ от почтового запроса?

+0

Технически * есть * способ начать загрузку с JavaScript , Например. http://stackoverflow.com/questions/17126453/html-table-to-excel-javascript/17129220#17129220 –

+0

К сожалению, максимальная длина URL-адреса данных очень ограничена: _ Схема URL-адреса «данные:» полезна только для короткие значения. Обратите внимание, что некоторые приложения, использующие URL-адреса, могут устанавливать ограничение по длине; например, URL-адреса, встроенные в якоря в HTML, имеют ограничение по длине, определенное в объявлении SGML для HTML [RFC1866]. LITLEN (1024) ограничивает количество символов, которые могут отображаться в одном литерале значения атрибута, ATTSPLEN (2100) ограничивает сумму всех длин всех спецификаций значений атрибутов, которые появляются в теге, а TAGLEN (2100) ограничивает общая длина тега. – bmesuere

ответ

0

Я попытался с помощью этого решения:

  1. Добавить невидимый IFRAME на странице
  2. Пусть форма пост в IFRAME с использованием целевого атрибута
  3. Используйте OnLoad событие фрейма (запускается сообщение формы), чтобы сбросить мою кнопку

Это работает в Firefox, но событие onLoad не запускается в Chrome, когда ответ сервера является файлом.

Решение, которое я довольствовалась использует куки и работает во всех браузерах:

  1. Когда пользователь нажимает на кнопку загрузки, добавить скрытое поле в форме, содержащей случайное значение.
  2. На сервере найдите поле формы, содержащее случайное значение, и установите cookie с тем же значением. Файл cookie будет установлен со следующим ответом сервера, поэтому, когда загрузка начнется.
  3. На клиенте начинайте опрос файлов cookie каждую секунду или около того, чтобы найти случайное значение с шага 1.
  4. После того, как клиент нашел значение, сбросьте кнопку.

Это соответствующий код из обработчика событий кнопки загрузки с #nonce быть скрытым полем, где я поставил случайное значение:

var nonce = Math.random();      // generate random number 
$("#nonce").val(nonce);       // set number as field value 
$("#downloadDataset").button('loading');  // set button to loading state 
var downloadTimer = setInterval(function() { // start polling the cookies 
    if (document.cookie.indexOf(nonce) != -1) { 
     $("#downloadDataset").button('reset'); // reset button 
     clearInterval(downloadTimer);   // stop polling the cookies 
    } 
}, 1000);          // check every 1000ms 
Смежные вопросы