Eu quero fazer:
$("img").bind('load', function() {
// do stuff
});
Mas o evento load não dispara quando a imagem é carregada do cache. Os documentos do jQuery sugerem um plugin para corrigir isso, mas não funciona
jquery
image
jquery-events
jquery-load
Tom Lehman
fonte
fonte
Respostas:
Se o
src
já estiver definido, o evento será disparado no caso em cache, antes mesmo de você vincular o manipulador de eventos. Para corrigir isso, você pode percorrer a verificação e o acionamento do evento com base.complete
, assim:Observe a alteração de
.bind()
para.one()
para que o manipulador de eventos não seja executado duas vezes.fonte
setTimeout(function(){//do stuff},0)
dentro da função 'carregar' ... o 0 dá ao sistema do navegador (DOM) uma marca extra para garantir que tudo seja atualizado corretamente..load()
não faz evento de disparo e tem um argumento necessário, utilizar.trigger("load")
em vez dissoPosso sugerir que você o recarregue em um objeto de imagem que não seja do DOM? Se estiver armazenado em cache, isso não levará tempo e a carga ainda será acionada. Se não estiver armazenado em cache, disparará a carga quando a imagem for carregada, que deve ser a mesma hora que a versão DOM da imagem termina o carregamento.
Javascript:
Atualizado (para lidar com várias imagens e com o anexo onload ordenado corretamente):
fonte
load
manipulador antes de adicioná-lo, mas isso não funcionará, mas para uma imagem, o código de OP funciona para muitos :)#img
é um ID, não um seletor de elementos :) Tambémthis.src
funciona, não é necessário usar o jQuery onde não é necessário :) Mas criar outra imagem parece exagerar nos dois casos IMO.imageLoaded
, usetmp.onload = imageLoaded.bind(this)
Minha solução simples, ele não precisa de nenhum plugin externo e, para casos comuns, deve ser suficiente:
use-o assim:
por exemplo, para desbotar suas imagens no carregamento, você pode:
Ou, como alternativa, se você preferir uma abordagem semelhante ao plugin jquery:
e use-o desta maneira:
por exemplo:
fonte
width
,max-height
e licençaheight:auto
, muitas vezes é necessário para definir a largura e altura apenas se você precisa para esticar a imagem; para uma solução mais robusta eu iria usar um plugin como ImagesLoadedVocê realmente tem que fazer isso com o jQuery? Você também pode anexar o
onload
evento diretamente à sua imagem;Ele dispara toda vez que a imagem é carregada, do cache ou não.
fonte
onload
manipulador será acionado quando a imagem for carregada uma segunda vez do cache?Você também pode usar este código com suporte para erro de carregamento:
fonte
load
manipulador primeiro e depois chamá-lo mais tarde naeach
função.Eu mesmo tive esse problema, procurei em todos os lugares uma solução que não envolvesse matar meu cache ou baixar um plugin.
Eu não vi esse tópico imediatamente, então encontrei outra coisa que é uma correção interessante e (acho) digna de ser postada aqui:
Na verdade, recebi essa idéia dos comentários aqui: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
Eu não tenho idéia do por que ele funciona, mas eu testei isso no IE7 e onde ele quebrou antes de agora funcionar.
Espero que ajude,
Editar
A resposta aceita realmente explica o porquê:
fonte
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
redefinir a fonte original.Usando o jQuery para gerar uma nova imagem com o src da imagem e atribuindo o método de carregamento diretamente a ele, o método de carregamento é chamado com êxito quando o jQuery termina de gerar a nova imagem. Isso está funcionando para mim no IE 8, 9 e 10
fonte
Uma solução que encontrei https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (este código foi extraído diretamente do comentário)
fonte
Uma modificação no exemplo da GUS:
Defina a fonte antes e depois da carga.
fonte
src
antes de anexar oonload
manipulador, uma vez que depois será suficiente.Apenas adicione novamente o argumento src em uma linha separada após a definição do objeto. Isso levará o IE a acionar o evento lad. É feio, mas é a solução mais simples que encontrei até agora.
fonte
Posso dar uma pequena dica, se você quiser fazer o seguinte:
Se você fizer isso quando o navegador armazena em cache as imagens, não há problema em sempre mostrar o img, mas carregar o img na imagem real.
fonte
Eu tive esse problema com o IE, onde a largura de e.target.windth seria indefinida. O evento de carregamento seria acionado, mas não consegui obter as dimensões da imagem no IE (chrome + FF funcionou).
Acontece que você precisa procurar por e.currentTarget.naturalWidth e e.currentTarget.naturalHeight .
Mais uma vez, o IE faz as coisas de maneira própria (mais complicada).
fonte
Você pode resolver seu problema usando o plug-in JAIL, que também permite carregar imagens com preguiça (melhorando o desempenho da página) e passando o retorno de chamada como parâmetro
O HTML deve se parecer com
fonte
Se você deseja uma solução CSS pura, esse truque funciona muito bem - use o objeto de transformação. Isso também funciona com imagens quando elas são armazenadas em cache ou não:
CSS:
HTML:
Exemplo de Codepen
Exemplo de Codepen LESS
fonte