A função que escrevi abaixo é suficiente para pré-carregar imagens na maioria, senão em todos os navegadores mais usados atualmente?
function preloadImage(url)
{
var img=new Image();
img.src=url;
}
Eu tenho uma matriz de URLs de imagem que faço loop e chamo a preloadImage
função para cada URL.
javascript
Francisc
fonte
fonte
img
objeto, por exemplo, em uma matriz no escopo pai.(new Image()).src = url;
new Image().src = url;
Respostas:
Sim. Isso deve funcionar em todos os principais navegadores.
fonte
Tente isso, acho que isso é melhor.
Fonte: http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/
fonte
onload
manipulador para qualquer uma das imagensonload
estado ou apenas instanciar imagens na memória.for (var i = 0.....
var
No meu caso, foi útil adicionar um retorno de chamada à sua função para o
onload
evento:Em seguida, envolva-o para o caso de uma matriz de URLs em imagens a serem pré-carregadas com retorno de chamada em tudo: https://jsfiddle.net/4r0Luoy7/
fonte
Alternativa CSS2: http://www.thecssninja.com/css/even-better-image-preloading-with-css2
Alternativa em CSS3: https://perishablepress.com/preload-images-css3/ (H / T Linh Dam)
NOTA: As imagens em um contêiner com
display:none
podem não ser pré-carregadas. Talvez visibilidade: oculto funcione melhor, mas eu não testei isso. Obrigado Marco Del Valle por apontar issofonte
display: none
não serão pré-carregadas.display: none
, (2) não useiwidth/height: 0
, (3) coloqueino-repeat
e coloquei uma posição em que a imagem ficaria do lado de fora (-<width>px -<height>px
você chegará lá, por isso, se suas imagens tiverem 100px em altura ou menos, você pode usar0 -100px
, em outras palavrasurl(...) no-repeat 0 -100px
.Eu recomendo que você use um try / catch para evitar alguns possíveis problemas:
OOP:
Padrão:
Além disso, enquanto eu amo o DOM, navegadores estúpidos antigos podem ter problemas com o uso do DOM, portanto evite-o completamente, ao contrário da contribuição do freedev. Image () tem melhor suporte em navegadores de lixo antigos.
fonte
Essa abordagem é um pouco mais elaborada. Aqui você armazena todas as imagens pré-carregadas em um contêiner, pode ser uma div. E depois você pode mostrar as imagens ou movê-las no DOM para a posição correta.
Experimente aqui , também adicionei alguns comentários
fonte
fonte
Sim, isso funcionará, no entanto , os navegadores limitarão (entre 4-8) as chamadas reais e, portanto, não armazenarão em cache / pré-carregar todas as imagens desejadas.
Uma maneira melhor de fazer isso é chamar onload antes de usar a imagem da seguinte maneira:
fonte
Aqui está a minha abordagem:
fonte
Solução para navegadores compatíveis com ECMAScript 2017
Nota: isso também funcionará se você estiver usando um transpiler como o Babel.
Você também pode ter esperado pelo carregamento de todas as imagens.
Ou use
Promise.all
para carregá-los em paralelo.Mais sobre promessas .
Mais sobre as funções "Async" .
Mais sobre a tarefa de desestruturação .
Mais sobre o ECMAScript 2015 .
Mais sobre o ECMAScript 2017 .
fonte
Posso confirmar que a abordagem da pergunta é suficiente para acionar as imagens a serem baixadas e armazenadas em cache (a menos que você tenha proibido o navegador de fazê-lo por meio dos cabeçalhos de resposta) em, pelo menos:
Para testar isso, fiz um pequeno aplicativo da web com vários pontos de extremidade que dormem por 10 segundos antes de servir a foto de um gatinho. Em seguida, adicionei duas páginas da web, uma das quais continha uma
<script>
tag na qual cada um dos gatinhos é pré-carregado usando apreloadImage
função da pergunta e a outra inclui todos os gatinhos da página usando<img>
tags.Em todos os navegadores acima, descobri que, se eu visitei a página do pré-carregador primeiro, esperei um pouco e depois fui para a página com as
<img>
tags, meus gatinhos renderizados instantaneamente. Isso demonstra que o pré-carregador carregou com êxito os gatinhos no cache em todos os navegadores testados.Você pode ver ou experimentar o aplicativo que usei para testar isso em https://github.com/ExplodingCabbage/preloadImage-test .
Observe, em particular, que essa técnica funciona nos navegadores acima, mesmo que o número de imagens em loop exceda o número de solicitações paralelas que o navegador deseja fazer por vez, ao contrário do que a resposta de Robin sugere. A taxa na qual as imagens de pré-carregamento será, naturalmente, limitado por quantos paralelo solicita o navegador está disposta a enviar, mas irá , eventualmente, solicitar a cada URL da imagem que você chama
preloadImage()
diante.fonte
Você pode mover esse código para index.html para pré-carregar imagens de qualquer URL
fonte
O navegador funcionará melhor usando a tag de link na cabeça.
fonte