Estou usando JavaScript com a biblioteca jQuery para manipular as miniaturas de imagens contidas em uma lista não ordenada. Quando a imagem é carregada, ela faz uma coisa; quando ocorre um erro, ela faz outra coisa. Estou usando jQuery load()
e error()
métodos como eventos. Após esses eventos, verifico o elemento DOM da imagem para o arquivo .complete para garantir que a imagem já não esteja carregada antes que o jQuery possa registrar os eventos.
Funciona corretamente, exceto quando ocorre um erro antes que o jQuery possa registrar os eventos. A única solução em que consigo pensar é usar o onerror
atributo img para armazenar uma "flag" em algum lugar globalmente (ou no próprio nó) que diz que falhou, para que o jQuery possa verificar essa "store / node" ao verificar .complete.
Alguém tem uma solução melhor?
Editar: pontos principais em negrito e detalhes adicionais adicionados abaixo: Estou verificando se uma imagem está completa (também carregada) DEPOIS de adicionar um evento de carga e erro à imagem. Dessa forma, se a imagem foi carregada antes dos eventos serem registrados, eu ainda saberei. Se a imagem não for carregada após os eventos, os eventos cuidarão dela quando o fizer. O problema é que posso verificar facilmente se uma imagem já está carregada, mas não sei se ocorreu um erro.
fonte
Respostas:
Outra opção é acionar os eventos
onload
e / ouonerror
criando um elemento de imagem na memória e configurando seusrc
atributo para osrc
atributo original da imagem original. Aqui está um exemplo do que quero dizer:Espero que isto ajude!
fonte
.attr
linha após as linhas.load
e.error
. Caso contrário, você corre o risco de a imagem carregar (ou encontrar um erro) antes que esses retornos de chamada sejam adicionados e eles não serão chamados..load()
e.error()
são confusos e agora preteridos, usam.on()
e usam os eventosload
eerror
como.Verifique as propriedades
complete
enaturalWidth
, nessa ordem.https://stereochro.me/ideas/detecting-broken-images-js
fonte
Com base no meu entendimento da Especificação HTML do W3C para o
img
elemento , você poderá fazer isso usando uma combinação dos atributoscomplete
enaturalHeight
, da seguinte forma:A partir da especificação para o
complete
atributo:Então, essencialmente,
complete
retorna true se a imagem terminou de carregar ou falhou ao carregar. Como queremos apenas o caso em que a imagem foi carregada com sucesso, também precisamos verificar onauturalHeight
atributo:E
available
é definido assim:Portanto, se a imagem estiver "quebrada" (falha ao carregar), ela estará no estado quebrado, e não no estado disponível, assim
naturalHeight
será 0.Portanto, a verificação
imgElement.complete && imgElement.naturalHeight !== 0
deve nos dizer se a imagem foi carregada com sucesso.Você pode ler mais sobre isso na especificação HTML do W3C para o
img
elemento ou no MDN .fonte
Eu tentei de muitas maneiras diferentes e dessa maneira é a única que funcionou para mim
Você também pode adicionar uma função de retorno de chamada acionada assim que todas as imagens estiverem carregadas no DOM e prontas. Isso também se aplica a imagens adicionadas dinamicamente. http://jsfiddle.net/kalmarsh80/nrAPk/
fonte
Use a
imagesLoaded
biblioteca javascript .Utilizável com Javascript simples e como um plugin jQuery.
Recursos:
Recursos
fonte
complete
propriedade não parece ser claramente suportada: não é possível encontrar uma fonte confiável de informações sobre o suporte ao navegador.complete
A propriedade também parece não ter uma especificação clara: a especificação HTML5 é a única que a menciona e ainda está em uma versão de rascunho no momento da gravação. Se você usanaturalWidth
enaturalHeight
apenas tem suporte para o IE9 +, por isso, para descobrir se a imagem está carregada, precisará de algum truque "inteligente" para fazê-la funcionar em navegadores antigos e verificar se o comportamento entre navegadores é consistenteRecuperar informações de elementos de imagem na página
Testar o trabalho no Chrome e Firefox
Trabalhando com o jsFiddle (abra o console para ver o resultado)
Nota: Eu usei o jQuery , achei que isso pode ocorrer em javascript completo
Encontrei boas informações aqui OpenClassRoom -> este é um fórum francês
fonte
Detector de rede em tempo real - verifique o status da rede sem atualizar a página: (não é jquery, mas testado e 100% funciona: (testado no Firefox v25.0))
Código:
se a conexão for perdida, basta pressionar o botão Novamente.
Atualização 1: detecção automática sem atualizar a página:
fonte
Depois de ler as soluções interessantes nesta página, criei uma solução fácil de usar, altamente influenciada pela postagem de SLaks e Noyo, que parece estar funcionando em versões bastante recentes (no momento da escrita) do Chrome, IE, Firefox, Safari e Opera (tudo no Windows). Além disso, funcionou em um emulador de iPhone / iPad que usei.
Uma grande diferença entre essa solução e o SLaks e o post de Noyo é que essa solução verifica principalmente as propriedades naturalWidth e naturalHeight. Descobri que nas versões atuais do navegador, essas duas propriedades parecem fornecer os resultados mais úteis e consistentes.
Esse código retorna VERDADEIRO quando uma imagem é carregada completamente E com sucesso. Ele retorna FALSE quando uma imagem ainda não foi totalmente carregada OU ou não foi carregada.
Você precisa estar ciente de que essa função também retornará FALSE se a imagem for uma imagem de 0x0 pixel. Mas essas imagens são bastante incomuns, e não consigo pensar em um caso muito útil em que você gostaria de verificar se uma imagem de pixel 0x0 ainda foi carregada :)
Primeiro, anexamos uma nova função chamada "isLoaded" ao protótipo HTMLImageElement, para que a função possa ser usada em qualquer elemento da imagem.
Então, sempre que precisarmos verificar o status de carregamento da imagem, basta chamar a função "isLoaded".
De acordo com o comentário de Giorgian na publicação de SLaks e Noyo, essa solução provavelmente só pode ser usada como uma verificação única no Safari Mobile se você planeja alterar o atributo SRC. Mas você pode contornar isso criando um elemento de imagem com um novo atributo SRC em vez de alterar o atributo SRC em um elemento de imagem existente.
fonte
É assim que eu consegui trabalhar em vários navegadores usando uma combinação dos métodos acima (eu também precisava inserir imagens dinamicamente no dom):
Nota: Você precisará fornecer um estado booleano válido para a variável isIE.
fonte
// Ou como um plug-in
fonte
Pelo que entendi, a propriedade .complete não é padrão. Pode não ser universal ... Percebo que parece funcionar de maneira diferente nos versos do Firefox IE. Estou carregando uma série de imagens em javascript e verificando se está completa. No Firefox, isso parece funcionar muito bem. No IE, isso não ocorre porque as imagens parecem estar sendo carregadas em outro segmento. Funciona apenas se eu colocar um atraso entre a minha atribuição ao image.src e quando verificar a propriedade image.complete.
Usar image.onload e image.onerror também não funciona para mim, porque preciso passar um parâmetro para saber de qual imagem estou falando quando a função é chamada. Qualquer maneira de fazer isso parece falhar, porque na verdade parece passar a mesma função, não instâncias diferentes da mesma função. Portanto, o valor que passo para identificar a imagem sempre acaba sendo o último valor no loop. Não consigo pensar em nenhuma maneira de contornar esse problema.
No Safari e no Chrome, estou vendo a imagem.com completa verdadeira e a largura natural definida mesmo quando o console de erros mostra um 404 para essa imagem ... e eu a removi intencionalmente para testar isso. Mas o acima funciona bem para Firefox e IE.
fonte
Este trecho de código me ajudou a corrigir problemas de cache do navegador:
Quando o cache do navegador está desativado, apenas este código não funciona:
para fazer funcionar, você deve adicionar:
fonte
Usando este
JavaScript
código, você pode verificar se a imagem foi carregada ou não com sucesso.Experimente isso
fonte
Eu tive muitos problemas com o carregamento completo de uma imagem e o EventListener.
O que quer que eu tenha tentado, os resultados não eram confiáveis.
Mas então eu encontrei a solução. Tecnicamente, não é agradável, mas agora nunca tive uma falha no carregamento da imagem.
O que eu fiz:
Em vez de carregar a imagem uma vez, basta carregá-la uma segunda vez diretamente após a primeira vez e as duas executam o manipulador de eventos.
Todas as minhas dores de cabeça se foram!
A propósito: Vocês do stackoverflow já me ajudaram mais de cem vezes. Por isso, muito obrigado!
fonte
Este funcionou bem para mim :)
fonte