Estou procurando uma maneira rápida e fácil de pré-carregar imagens com JavaScript. Estou usando jQuery se isso é importante.
Eu vi isso aqui ( http: //nettuts.com ... ):
function complexLoad(config, fileNames) {
for (var x = 0; x < fileNames.length; x++) {
$("<img>").attr({
id: fileNames[x],
src: config.imgDir + fileNames[x] + config.imgFormat,
title: "The " + fileNames[x] + " nebula"
}).appendTo("#" + config.imgContainer).css({ display: "none" });
}
};
Mas, parece um pouco exagerado para o que eu quero!
Eu sei que existem plugins jQuery por aí que fazem isso, mas todos parecem um pouco grandes (em tamanho); Eu só preciso de uma maneira rápida, fácil e curta de pré-carregar imagens!
$.each(arguments,function(){(new Image).src=this});
Respostas:
Rápido e fácil:
Ou, se você quiser um plugin jQuery:
fonte
$('<img />')
apenas cria um elemento de imagem na memória (veja o link ). Parece'$('<img src="' + this + '" />')
que realmente criaria o elemento dentro de uma DIV oculta, porque é mais "complicado". No entanto, não acho que isso seja necessário para a maioria dos navegadores.$.preload(['img1.jpg', 'img2.jpg'])
?$(window).load(function(){/*preload here*/});
por dentro, pois dessa maneira todas as imagens no documento são carregadas primeiro, é provável que sejam necessárias primeiro.load
evento antes de definir osrc
caso de a imagem terminar de carregar antes de o evento de carregamento ser definido?$('<img/>').load(function() { /* it's loaded! */ }).attr('src', this);
Aqui está uma versão aprimorada da primeira resposta que realmente carrega as imagens no DOM e as oculta por padrão.
fonte
hide()
é mais conciso quecss('display', 'none')
.Use o objeto JavaScript Image .
Esta função permite ativar um retorno de chamada ao carregar todas as imagens. No entanto, observe que ele nunca acionará um retorno de chamada se pelo menos um recurso não estiver carregado. Isso pode ser facilmente corrigido implementando
onerror
retorno de chamada e incrementandoloaded
valor ou manipulando o erro.fonte
onload
evento mesmo se a imagem estiver em cache? (Porqueimg.onload
é declarado primeiro). Isto é o que meus testes mostraram.JP, Depois de verificar sua solução, eu ainda estava tendo problemas no Firefox, onde ele não carregava as imagens antes de prosseguir com o carregamento da página. Eu descobri isso colocando alguns
sleep(5)
no meu script do lado do servidor. Eu implementei a seguinte solução com base na sua, que parece resolver isso.Basicamente, adicionei um retorno de chamada ao seu plugin de pré-carregamento do jQuery, para que ele seja chamado depois que todas as imagens forem carregadas corretamente.
Fora de interesse, no meu contexto, estou usando isso da seguinte maneira:
Espero que isso ajude alguém que chega a esta página do Google (como eu) procurando uma solução para pré-carregar imagens nas chamadas do Ajax.
fonte
checklist = this.length
E na função onload:checklist--
Então:if (checklist == 0) callback();
.attr({ src: this }).load(function() {...})
caso.load(function() {...}).attr({ src: this })
contrário, você terá problemas de cache.Esse código jQuery de uma linha cria (e carrega) um elemento DOM img sem mostrá-lo:
fonte
O uso é bastante simples:
http://jsfiddle.net/yckart/ACbTK/
fonte
Eu tenho um pequeno plugin que lida com isso.
É chamado waitForImages e pode manipular
img
elementos ou qualquer elemento com referência a uma imagem no CSS, por exemplodiv { background: url(img.png) }
.Se você simplesmente deseja carregar todas as imagens, incluindo as referenciadas no CSS, eis como você faria isso :)
fonte
:visible
ao seletor personalizado.load
evento, quando aplicado às imagens: "não funciona de maneira consistente nem confiável no navegador cruzado". Como o plugin conseguiu contornar isso?você pode carregar imagens em seu html em algum lugar usando a
display:none;
regra css e depois mostrá-las quando quiser com js ou jquerynão use funções js ou jquery para pré-carregar é apenas uma regra css versus muitas linhas de js a serem executadas
exemplo: Html
Css:
jQuery:
O pré-carregamento de imagens por jquery / javascript não é bom, pois as imagens levam alguns milissegundos para carregar na página + você tem milissegundos para o script ser analisado e executado, especialmente se forem imagens grandes, por isso é melhor também ocultá-las em hml para desempenho, porque a imagem é realmente pré-carregada sem ser visível, até você mostrar isso!
fonte
este plugin jquery imageLoader tem apenas 1,39kb
uso:
também existem outras opções, como se você deseja carregar as imagens de maneira síncrona ou assíncrona e um evento completo para cada imagem individual.
fonte
allcomplete
retorno de chamada é executado após o DOM estar pronto. Há uma boa chance de as imagens terminarem de carregar depois que o DOM estiver pronto, mas não há motivo para supor. Não sei por que você acha que os retornos de chamada são mágicos e são executados após o DOM estar pronto ... você pode explicar de onde está obtendo isso? Só porque as imagens são carregadas não significa que o DOM está prontoNB to use this as an image preloader simply put your $(document).ready(function(){}); into your 'allcomplete' event : > simples!
... recomenda diretamente o que esta resposta mostra.Uma maneira rápida e sem plug-ins de pré-carregar imagens no jQuery e obter uma função de retorno de chamada é criar várias
img
tags ao mesmo tempo e contar as respostas, por exemploObserve que se você deseja oferecer suporte ao IE7, precisará usar esta versão um pouco menos bonita (que também funciona em outros navegadores):
fonte
Obrigado por isso! Eu gostaria de acrescentar um pouco da resposta do JP - não sei se isso vai ajudar alguém, mas dessa forma você não precisa criar uma série de imagens e pode pré-carregar todas as imagens grandes, se quiser. nomeie seus polegares corretamente. Isso é útil porque eu tenho alguém que está escrevendo todas as páginas em html, e isso garante menos uma etapa para elas - eliminando a necessidade de criar a matriz de imagens e outra etapa em que as coisas podem estragar tudo.
Basicamente, para cada imagem na página, ele pega o src de cada imagem; se corresponder a determinados critérios (é um polegar ou imagem da página inicial), ele altera o nome (uma sequência básica substituída na imagem src) e carrega as imagens. .
No meu caso, a página estava cheia de imagens em miniatura, todas nomeadas como image_th.jpg, e todas as imagens grandes correspondentes são nomeadas image_lg.jpg. O polegar para grande substitui o _th.jpg por _lg.jpg e pré-carrega todas as imagens grandes.
Espero que isso ajude alguém.
fonte
fonte
Eu uso o seguinte código:
fonte
Eu usaria um arquivo de manifesto para informar aos navegadores da web (modernos) que também carregassem todas as imagens relevantes e as armazenassem em cache. Use Grunt e grunt-manifest para fazer isso automaticamente e nunca mais se preocupe com scripts de pré-carregamento, invalidadores de cache, CDN etc.
https://github.com/gunta/grunt-manifest
fonte
Isso funciona para mim, mesmo no IE9:
fonte
Eu queria fazer isso com uma sobreposição personalizada da API do Google Maps. Seu código de amostra simplesmente usa JS para inserir elementos IMG e a caixa de espaço reservado para a imagem é exibida até a imagem ser carregada. Encontrei uma resposta aqui que funcionou para mim: https://stackoverflow.com/a/10863680/2095698 .
Isso pré-carrega uma imagem como sugerido anteriormente e, em seguida, usa o manipulador para anexar o objeto img após o carregamento do URL do img. A documentação do jQuery alerta que as imagens armazenadas em cache não funcionam bem com esse código de manipulador de eventos, mas está funcionando para mim no FireFox e Chrome, e não preciso me preocupar com o IE.
fonte
.attr('src',value)
não.attr('src',this)
apenas para apontar :)
fonte
this
dentro do retorno de chamada passado$.each
é atribuído ao valor que está sendo iterado.$("div").each(function(i, el){ console.log(el == this);});
gera todos ostrue
s; A iteração sobre a matriz parece se comportar de maneira diferente.5 linhas em coffeescript
fonte
Para quem conhece um pouco do actionscript, é possível verificar o flash player, com o mínimo esforço, e criar um pré-carregador de flash, que também pode ser exportado para html5 / Javascript / Jquery. Para usar se o flash player não for detectado, verifique exemplos de como fazer isso com a função do youtube de volta ao html5 player :) E crie o seu. Eu não tenho os detalhes, porque ainda não comecei, se eu não me esquecer, publicarei mais tarde e tentarei algum código Jquery padrão para o meu.
fonte