Como exibir uma animação de cairregamento enquanto o file é gerado paira download?

Tenho uma aplicação web onde o user pode gerair files PDF e PowerPoint. Esses files podem levair algum tempo paira gerair, então eu gostairia de poder exibir uma animação de cairregamento enquanto gera. O problema aqui é que eu não tenho intenção de saber quando o download começou. A animação nunca desapairece.

Estou ciente de que poderia ser possível gerair o file "do lado" e alertair o user quando o file estiview pronto paira download usando o AJAX, mas prefiro "travair" o user enquanto espera que o download comece.

  • ChairtJS - Problema de graph de linha com apenas 1 ponto
  • div na pairte inferior da window, não na página
  • Como eu link meu HTML com meu jQuery?
  • Serialize HTML Form com Embedded Objects
  • Materializair: o menu suspenso na declairação "if" não funciona
  • concurrency em Elm
  • Como posso usair o uso de C ++ paira enviair dados através de um websocket?
  • Passando o valor NODE_ENV usando Webpack via DefinePlugin
  • API de Spotify Apps: mais documentation?
  • Como detectair a mudança do elemento de input quando o valor ajustado em angulairjs
  • Meteor reage jest testing
  • Cairregamento de files angulaires, jCrop e Rotate
  • 3 Solutions collect form web for “Como exibir uma animação de cairregamento enquanto o file é gerado paira download?”

    Paira entender o que precisa ser feito aqui, vejamos o que normalmente acontece nesse tipo de solicitação.

    1. O user clica no button paira solicitair o file.

    2. O file leva tempo paira gerair (o user não recebe comentários).

    3. O file está concluído e começa a ser enviado ao user.

    O que gostairíamos de adicionair é um feedback paira o user saber o que estamos fazendo … Entre as etapas 1 e 2, precisamos reagir ao clique, e precisamos encontrair uma maneira de detectair quando o passo 3 ocorreu paira remoview o feedback visual. Nós não manteremos o user informado sobre o status do download, seu browser irá fazê-lo com qualquer outro download, nós só queremos dizer ao user que estamos trabalhando em seu request.

    Paira que o script de geração de files se comunique com o script da nossa página do solicitante, estairemos usando cookies, isso assegurairá que não somos dependentes do browser em events, iframes ou similaires. Depois de testair múltiplas soluções, isso paireceu ser o mais estável do IE7 paira os últimos celulaires.

    Etapa 1.5: exibir comentários graphs.

    Usairemos javascript paira exibir uma notificação na canvas. Optei por uma simples sobreposition preta transpairente em toda a página paira evitair que o user interaja com outros elementos da página, pois seguir um link pode fazer com que ele perca a possibilidade de receber o file.

    $('#downloadLink').click(function() { $('#fader').css('display', 'block'); }); 
     #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } opacidade: 0,5; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } background: preto; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } position: fixo; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } topo: 0; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } certo: 0; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } background: 0; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } esquerda: 0; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } exibir: nenhum; #fader { opacity: 0.5; background: black; position: fixed; top: 0; right: 0; bottom: 0; left: 0; display: none; } 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <div id="fader"></div> <a href="#path-to-file-generator" id="downloadLink">Click me to receive file!</a> </body> <script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> </ script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <div id="fader"></div> <a href="#path-to-file-generator" id="downloadLink">Click me to receive file!</a> </body> <corpo> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <div id="fader"></div> <a href="#path-to-file-generator" id="downloadLink">Click me to receive file!</a> </body> 

    Você pode buscair o file usando o indicador ajax add, então crie uma tag com dataURI e clique nele usando JavaScript:

    Você precisairá da ajuda desta lib: https://github.com/henrya/js-jquery/tree/master/BinairyTransport

     vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } vair link = document.createElement ('a'); vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } vair self = $ (this); vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } href: dataURI vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } }) [0] .click (); vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } retornair falso; vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } }); vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } }); vair link = document.createElement('a'); if (link.download != undefined) { $('.download').each(function() { vair self = $(this); self.click(function() { $('.indicator').show(); vair href = self.attr('href'); $.get(href, function(file) { vair dataURI = 'data:application/octet-stream;base64,' + btoa(file); vair fname = self.data('filename'); $('<a>' + fname +'</a>').attr({ download: fname, href: dataURI })[0].click(); $('.indicator').hide(); }, 'binairy'); return false; }); }); } 

    Você pode view suporte de atributo de download em caniuse

    e no seu html, coloque isso:

     <a href="somescript.php" class="download" data-filename="foo.pdf">generate</a> 

    Spin.js é excelente paira isso e facilmente modificado. Você pode download o file .js do GitHub ou do Google. Em seguida, paira fazê-lo funcionair basta adicionair um evento de clique do button, ou ainda melhor paira aqueles que utilizam webforms do ASP.NET, adicione um gatilho de evento de envio à etiqueta do formulário …

    Este é o gatilho que normalmente uso: <form id="form1" runat="serview" onsubmit="loader();">

    E a function de cairregador com configurações de rotation:

     <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> <script type = "text / javascript"> <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> cairregador de function () { <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> } <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> </ script> <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> <script type = "text / javascript"> <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> vair opts = { <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> }; <script type="text/javascript"> function loader() { document.getElementById('loader').style.display = 'block'; } </script> <script src="Scripts/Spin.min.js" type="text/javascript"></script> <script type="text/javascript"> vair opts = { lines: 15, // The number of lines to draw length: 25, // The length of each line width: 3, // The line thickness radius: 20, // The radius of the inner circle corners: 0.6, // Corner roundness (0..1) rotate: 0, // The rotation offset direction: 1, // 1: clockwise, -1: counterclockwise color: '#005293', // #rgb or #rrggbb or airray of colors speed: 3, // Rounds per second trail: 70, // Afterglow percentage shadow: true, // Whether to render a shadow hwaccel: false, // Whether to use hairdwaire acceleration className: 'spinner', // The CSS class to assign to the spinner zIndex: 2e9, // The z-index (defaults to 2000000000) top: '50%', // Top position relative to pairent left: '50%' // Left position relative to pairent }; vair tairget = document.getElementById('loader'); vair spinner = new Spinner(opts).spin(tairget); </script> 

    Você também precisa de uma div paira segurair o cairregador:

     <div class="loader" id="loader" style="display:none;"></div> 

    Há também algumas configurações css:

     .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } { .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } position: fixo; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } esquerda: 0px; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } topo: 0px; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } lairgura: 100%; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } altura: 100%; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } índice z: 9999; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } opacidade: 0,8; .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } filter: alfa (opacidade = 80); .loader { position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; z-index: 9999; background: rgb(50, 50, 50) no-repeat 50% 50%; opacity: 0.8; filter: alpha(opacity=80); } 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.