Eu tenho uma página da web que inclui um monte de imagens. Às vezes, a imagem não está disponível, portanto, uma imagem quebrada é exibida no navegador do cliente.
Como uso o jQuery para obter o conjunto de imagens, filtrá-lo para imagens quebradas e substituir o src?
--Eu pensei que seria mais fácil fazer isso com o jQuery, mas ficou muito mais fácil usar apenas uma solução JavaScript pura, ou seja, a fornecida pela Prestaul.
javascript
jquery
html
brokenimage
Dan Lord
fonte
fonte
Eu uso o
error
manipulador incorporado :Edit: O
error()
método está obsoleto no jquery 1.8 e superior. Em vez disso, você deve usar.on("error")
:fonte
Caso alguém como eu tente anexar o
error
evento a umaimg
tag HTML dinâmica , gostaria de salientar que existe um problema:Aparentemente, os
img
eventos de erro não surgem na maioria dos navegadores, ao contrário do que o padrão diz.Portanto, algo como o seguinte não funcionará :
Espero que isso seja útil para outra pessoa. Eu gostaria de ter visto isso aqui neste tópico. Mas eu não fiz. Então, eu estou adicionando
fonte
Aqui está uma solução autônoma:
fonte
$.browser
foi descontinuado e removido agora, use a detecção de recursos (neste caso, fica mais complicado).204 No Content
, seria uma imagem quebrada.Acredito que é isso que você procura : jQuery.Preload
Aqui está o código de exemplo da demonstração, você especifica o carregamento e as imagens não encontradas e está pronto:
fonte
Fonte: http://www.developria.com/2009/03/jquery-quickie---broken-images.html
fonte
Enquanto o OP procurava substituir o SRC, tenho certeza de que muitas pessoas que responderam a essa pergunta podem apenas querer ocultar a imagem corrompida. Nesse caso, essa solução simples funcionou muito bem para mim.
Usando JavaScript embutido:
Usando JavaScript Externo:
Usando JavaScript externo moderno:
Consulte o suporte do navegador para as funções NoteList.forEach e arrow .
fonte
Aqui está uma maneira rápida e suja de substituir todas as imagens quebradas, e não há necessidade de alterar o código HTML;)
exemplo codepen
fonte
Como não consegui encontrar um script para atender às minhas necessidades, criei uma função recursiva para verificar imagens quebradas e tentar recarregá-las a cada quatro segundos até que elas sejam corrigidas.
Limitei-o a 10 tentativas, como se não estivesse carregado até então, a imagem pode não estar presente no servidor e a função entraria em um loop infinito. Ainda estou testando. Sinta-se livre para ajustá-lo :)
fonte
Esta é uma técnica de baixa qualidade, mas é praticamente garantida:
fonte
Você pode usar a própria busca do GitHub para isso:
Frontend: https://github.com/github/fetch
ou para Backend, uma versão do Node.js.: https://github.com/bitinn/node-fetch
Edit: Este método vai substituir o XHR e supostamente já está no Chrome. Para quem ler isso no futuro, talvez você não precise da biblioteca mencionada acima.
fonte
Este é JavaScript, deve ser compatível com vários navegadores e é entregue sem a marcação feia
onerror=""
:CODEPEN:
fonte
while (i--)
Melhor chamada usando
Como o uso
document.ready
não é necessário implica que as imagens sejam carregadas, apenas o HTML. Portanto, não há necessidade de uma chamada atrasada.fonte
Variante CoffeeScript :
Fiz isso para corrigir um problema com o Turbolinks que faz com que o método .error () seja gerado no Firefox algumas vezes, mesmo que a imagem esteja realmente lá.
fonte
Usando a resposta do Prestaul , adicionei algumas verificações e prefiro usar a maneira jQuery.
fonte
Se você inseriu o seu
img
cominnerHTML
, como:,$("div").innerHTML = <img src="wrong-uri">
você pode carregar outra imagem se ela falhar, por exemplo:Por que é
javascript: _
necessário? Como os scripts injetados no DOM por meio de tags de scriptinnerHTML
não são executados no momento em que são injetados, você deve ser explícito.fonte
Eu encontrei este post enquanto olha para este outro post SO . Abaixo está uma cópia da resposta que dei lá.
Sei que esse é um tópico antigo, mas o React se tornou popular e, talvez, alguém usando o React venha aqui procurando uma resposta para o mesmo problema.
Portanto, se você estiver usando o React, poderá fazer algo como o abaixo, que foi uma resposta original fornecida por Ben Alpert da equipe do React aqui
fonte
Eu criei um violino para substituir a imagem quebrada usando o evento "onerror". Isso pode ajudá-lo.
fonte
Aqui está um exemplo usando o objeto Imagem HTML5 agrupado pelo JQuery. Chame a função load para o URL da imagem principal e, se esse carregamento causar um erro, substitua o atributo src da imagem por um URL de backup.
fonte
JS puro. Minha tarefa era: se a imagem 'bl-once.png' estiver vazia -> insira a primeira imagem (que não possui status 404) da lista de matriz (no diretório atual):
Talvez seja necessário melhorar, mas:
Portanto, ele inserirá o arquivo 'needed.png' correto no meu src ou 'no-image.png' do diretório atual.
fonte
Não tenho certeza se existe uma maneira melhor, mas posso pensar em um hack para obtê-lo - você pode colocar o Ajax no URL img e analisar a resposta para ver se a imagem realmente voltou. Se ele voltou como um 404 ou algo assim, troque o img. Embora eu espere que isso seja bastante lento.
fonte
Eu resolvi meu problema com essas duas funções simples:
fonte
jQuery 1.8
jQuery 3
referência
fonte
Eu acho que tenho uma maneira mais elegante com a delegação de eventos e a captura de eventos
window
,error
mesmo quando a imagem de backup falha ao carregar.O ponto é:
Coloque o código no
head
e executado como o primeiro script embutido. Portanto, ele escutará os erros após o script.Use a captura de eventos para capturar os erros, especialmente para os eventos que não borbulham.
Use a delegação de eventos que evita eventos vinculativos em cada imagem.
Atribua
img
um atributo ao elemento error após atribuí-lo abackup.png
para evitar o desaparecimento dobackup.png
loop infinito e subsequente, como abaixo:img erro-> backup.png-> erro-> backup.png-> erro -> ,,,,,
fonte
let isImgErrorHandled = target.src === 'backup.png';
, pois simplifica um pouco.target.src='backup.png'
, mas da próxima vezconsole.log(target.src)
pode não serbackup.png
Você pode passar um caminho de espaço reservado e acessar todas as propriedades do objeto de imagem com falha via
$*
:http://jsfiddle.net/ARTsinn/Cu4Zn/
fonte
Isso me frustra há anos. Minha correção CSS define uma imagem de plano de fundo no
img
. Quando uma imagem dinâmicasrc
não é carregada em primeiro plano, um espaço reservado é visível naimg
BG. Isso funciona se as imagens têm um tamanho padrão (por exemploheight
,min-height
,width
e / oumin-width
).Você verá o ícone de imagem quebrada, mas é uma melhoria. Testado no IE9 com sucesso. O iOS Safari e o Chrome nem mostram um ícone quebrado.
Adicione um pouco de animação para dar
src
tempo para carregar sem um piscar de fundo. O Chrome desvanece-se suavemente no fundo, mas o Safari da área de trabalho não.fonte
Se a imagem não puder ser carregada (por exemplo, porque não está presente no URL fornecido), o URL da imagem será alterado para o padrão,
Para mais informações sobre .error ()
fonte
Eu tenho o mesmo problema. Este código funciona bem no meu caso.
fonte
Às vezes, o uso do
error
evento não é viável, por exemplo, porque você está tentando fazer algo em uma página que já está carregada, como quando você está executando um código pelo console, um bookmarklet ou um script carregado de forma assíncrona. Nesse caso, verificar queimg.naturalWidth
eimg.naturalHeight
são 0 parece fazer o truque.Por exemplo, aqui está um trecho para recarregar todas as imagens quebradas do console:
fonte
Eu achei que funcionava melhor, se alguma imagem falha ao carregar na primeira vez, ela foi completamente removida do DOM. A execução
console.clear()
mantém a janela do console limpa, pois os erros 404 não podem ser omitidos nos blocos try / catch.fonte