Quero definir uma imagem de plano de fundo na tag body e, em seguida, executar um código - como este:
$('body').css('background-image','http://picture.de/image.png').load(function() {
alert('Background image done loading');
// This doesn't work
});
Como posso garantir que a imagem de plano de fundo esteja totalmente carregada?
javascript
jquery
Peter
fonte
fonte
Image()
objeto que possuionload
evento.url()
Respostas:
tente isto:
isso criará uma nova imagem na memória e usará o evento load para detectar quando o src é carregado.
fonte
javascript:void($('<img/>').attr('src', 'http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg').load(function() { $('html').css('background-image', 'url(http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg)'); }))
e verifique as solicitações HTTP no Firebug. Se eu abri a página de cintilação com esta imagem aberta em outra guia, ela não faz nenhuma solicitação HTTP, apenas mostra esta imagem instantaneamente. e quando eu limpo o cache e o executo, houve uma solicitação..remove()
no$('<img/>')
objeto para evitar uma fuga de memória. Você deve ver um consumo estável de memória no primeiro teste e um aumento de memória no segundo. Depois de algumas horas em execução no Chrome 28, o primeiro teste demora 80 MB e o segundo, 270 MB.Eu tenho um plugin jQuery chamado
waitForImages
que pode detectar quando as imagens de fundo foram baixadas.fonte
each
retorno de chamada.delay()
não funciona assim.Algo assim:
fonte
bg.replace( ... , my_src )
. Mas minha pergunta é: uma vez que o $ ('<img>') seja carregado, o que exatamente acontece com isso<img>
... quero dizer, não é realmente real - é apenas um espaço reservado simulado, certo?<img>
nunca é inserido no DOM; é apenas usado para "enganar" o navegador para carregar o arquivo de imagem no cache.Não há retornos de chamada JS para ativos CSS.
fonte
solução JS pura que adicionará o pré-carregador, defina a imagem de plano de fundo e configure-a para a coleta de lixo junto com seu ouvinte de eventos :
Versão curta:
Um pouco mais com boa transição de opacidade:
fonte
Aqui está um pequeno plugin que eu criei para permitir que você faça exatamente isso, ele também funciona em várias imagens de fundo e em vários elementos:
Leia o artigo:
http://catmull.uk/code-lab/background-image-loaded/
ou vá direto para o código do plugin:
http://catmull.uk/downloads/bg-loaded/bg-loaded.js
Portanto, inclua o plug-in e chame-o no elemento:
Obviamente, baixe o plug-in e armazene-o em sua própria hospedagem.
Por padrão, ele adiciona uma classe "bg-loaded" adicional a cada elemento correspondente depois que o plano de fundo é carregado, mas você pode facilmente mudar isso passando uma função diferente como esta:
Aqui está um codepen demonstrando seu funcionamento.
http://codepen.io/catmull/pen/Lfcpb
fonte
Eu localizei uma solução que funcionou melhor para mim e que tem a vantagem de ser utilizável com várias imagens (caso não ilustrado neste exemplo).
Da resposta de @ adeneo nesta pergunta :
fonte
Eu fiz um truque de javascript puro para tornar isso possível.
Ou
css:
fonte
https://github.com/alexanderdickson/waitForImages
fonte