Gostaria de colocar uma animação de círculo giratório "aguarde, carregando" no meu site. Como devo fazer isso usando o jQuery?
Você poderia fazer isso de várias maneiras diferentes. Pode ser um status sutil como pequeno na página dizendo "Carregando ..." ou tão alto quanto um elemento inteiro acinzentando a página enquanto os novos dados estão sendo carregados. A abordagem que estou adotando abaixo mostrará como realizar os dois métodos.
Vamos começar com uma boa animação de "carregamento" em http://ajaxload.info que eu usarei
Vamos criar um elemento que possamos mostrar / ocultar sempre que fizermos uma solicitação ajax:
<div class="modal"><!-- Place at bottom of page --></div>
Em seguida, vamos dar um toque:
/* Start by setting display:none to make this hidden.
Then we position it in relation to the viewport window
with position:fixed. Width, height, top and left speak
for themselves. Background we set to 80% white with
our animation centered, and no-repeating */
.modal {
display: none;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba( 255, 255, 255, .8 )
url('http://i.stack.imgur.com/FhHRx.gif')
50% 50%
no-repeat;
}
/* When the body has the loading class, we turn
the scrollbar off with overflow:hidden */
body.loading .modal {
overflow: hidden;
}
/* Anytime the body has the loading class, our
modal element will be visible */
body.loading .modal {
display: block;
}
Tudo bem, para o jQuery. Esta próxima parte é realmente muito simples:
$body = $("body");
$(document).on({
ajaxStart: function() { $body.addClass("loading"); },
ajaxStop: function() { $body.removeClass("loading"); }
});
É isso aí! Anexamos alguns eventos ao elemento body sempre que os eventos ajaxStart
ou ajaxStop
são disparados. Quando um evento ajax é iniciado, adicionamos a classe "loading" ao corpo. e quando os eventos são concluídos, removemos a classe "loading" do corpo.
Veja em ação: http://jsfiddle.net/VpDUG/4952/
.ajaxStop()
e.ajaxStart()
deve ser anexado apenas ao documento. docsQuanto à imagem de carregamento real, consulte este site para várias opções.
Quanto a exibir um DIV com esta imagem quando uma solicitação é iniciada, você tem algumas opções:
A) Mostre e oculte manualmente a imagem:
B) Use ajaxStart e ajaxComplete :
Usando isso, o elemento mostrará / ocultará qualquer solicitação. Pode ser bom ou ruim, dependendo da necessidade.
C) Use retornos de chamada individuais para uma solicitação específica:
fonte
Juntamente com o que Jonathan e Samir sugeriram (ambas excelentes respostas!), O jQuery criou alguns eventos que serão acionados para você ao fazer uma solicitação de ajax.
Tem o
ajaxStart
evento... e é irmão, o
ajaxStop
eventoJuntos, eles são uma ótima maneira de mostrar uma mensagem de progresso quando qualquer atividade do ajax está acontecendo em qualquer lugar da página.
HTML:
Roteiro:
fonte
.ajaxStart
só pode ser anexado ao documento, ou seja.$(document).ajaxStart(function(){}).
Você pode pegar um GIF animado de um círculo giratório em Ajaxload - coloque-o em algum lugar da hierarquia de arquivos do site. Então você só precisa adicionar um elemento HTML com o código correto e removê-lo quando terminar. Isso é bastante simples:
Você só precisa usar estes métodos na sua chamada AJAX:
Isso tem algumas advertências: primeiro, se você tiver dois ou mais locais em que a imagem de carregamento pode ser exibida, precisará acompanhar quantas chamadas estão sendo executadas ao mesmo tempo e se esconder apenas quando estiverem tudo feito. Isso pode ser feito usando um contador simples, que deve funcionar em quase todos os casos.
Em segundo lugar, isso ocultará apenas a imagem de carregamento em uma chamada AJAX bem-sucedida. Para lidar com os estados de erro, você precisa olhar para
$.ajax
, que é mais complexo do que$.load
,$.get
e similares, mas muito mais flexível também.fonte
showLoadingImage
antes de começar ehideLoadingImage
depois de terminar. Deve ser bastante simples. Você pode precisar fazer algum tipo desetTimeout
chamada para garantir que o navegador realmente renderize a nova<img>
tag - eu já vi alguns casos em que isso não incomoda até o JavaScript terminar de executar.A excelente solução de Jonathon é interrompida no IE8 (a animação não é exibida). Para corrigir isso, altere o CSS para:
fonte
O jQuery fornece ganchos de eventos para quando as solicitações do AJAX começam e terminam. Você pode conectar-se a eles para mostrar seu carregador.
Por exemplo, crie a seguinte div:
Defina-o
display: none
em suas folhas de estilo. Você pode modelá-lo da maneira que quiser. Você pode gerar uma boa imagem de carregamento no Ajaxload.info , se desejar.Em seguida, você pode usar algo como o seguinte para fazer com que seja mostrado automaticamente ao enviar solicitações do Ajax:
Basta adicionar este bloco Javascript ao final da sua página antes de fechar a etiqueta do corpo ou onde quiser.
Agora, sempre que você enviar solicitações Ajax, a
#spinner
div será mostrada. Quando a solicitação for concluída, ela será ocultada novamente.fonte
Se você estiver usando o Turbolinks With Rails, esta é a minha solução:
Este é o CoffeeScript
Este é o CSS do SASS baseado na primeira excelente resposta de Jonathan Sampson
fonte
Como Mark H disse, o blockUI é o caminho.
Ex.:
Obs .: peguei o ajax-loader.gif em http://www.ajaxload.info/
fonte
Com todo o respeito a outras postagens, você tem aqui uma solução muito simples, usando CSS3 e jQuery, sem usar outros recursos nem arquivos externos.
fonte
Isso faria os botões desaparecerem, uma animação de "carregamento" apareceria no lugar deles e, finalmente, apenas exibiria uma mensagem de sucesso.
fonte
A maioria das soluções que eu vejo espera que projetemos uma sobreposição de carregamento, mantenha-a oculta e depois a reexiba quando necessário, ou mostre um gif ou imagem etc.
Eu queria desenvolver um plugin robusto, onde, com uma simples chamada jQuery, eu possa exibir a tela de carregamento e derrubá-la quando a tarefa estiver concluída.
Abaixo está o código. Depende da fonte awesome e jQuery:
Basta colocar o acima em um arquivo js e incluí-lo em todo o projeto.
Adição de CSS:
Invocação:
fonte
Observe que, ao usar o ASP.Net MVC, com
using (Ajax.BeginForm(...
, a configuração deajaxStart
não funcionará.Use o
AjaxOptions
para superar esse problema:fonte
Por https://www.w3schools.com/howto/howto_css_loader.asp , este é um processo de duas etapas sem JS:
1. Adicione este HTML onde você deseja o botão giratório:
<div class="loader"></div>
2. Adicione este CSS para fazer o girador real:
fonte
$("#loader").toggle();
antes de fazer a solicitação de longa execução para iniciar a animação e fazer outra chamada na função de retorno de chamada da solicitação para ocultá-la.Eu uso CSS3 para animação
fonte