Mam stronę internetową zawierającą kilka zdjęć. Czasami obraz nie jest dostępny, więc uszkodzony obraz jest wyświetlany w przeglądarce klienta.
Jak użyć jQuery, aby uzyskać zestaw obrazów, przefiltrować go do uszkodzonych obrazów, a następnie zastąpić src?
- Pomyślałem, że łatwiej będzie to zrobić za pomocą jQuery, ale znacznie łatwiej było po prostu użyć czystego rozwiązania JavaScript, czyli tego dostarczonego przez Prestaul.
javascript
jquery
html
brokenimage
Dan Lord
źródło
źródło
Korzystam z wbudowanego modułu
error
obsługi:Edit:
error()
metoda jest przestarzałe w jQuery 1.8 i wyższej. Zamiast tego należy użyć.on("error")
:źródło
W przypadku, gdy ktoś taki jak ja próbuje dołączyć
error
wydarzenie do dynamicznego HTMLimg
znacznika , chciałbym zauważyć, że istnieje pewien haczyk:Najwyraźniej
img
zdarzenia błędów nie powodują bąbelkowania w większości przeglądarek, w przeciwieństwie do standardu mówi .Tak więc coś takiego nie będzie działać :
Mam nadzieję, że będzie to pomocne komuś innemu. Chciałbym widzieć to tutaj w tym wątku. Ale nie zrobiłem tego. Dodam to
źródło
Oto samodzielne rozwiązanie:
źródło
$.browser
jest już nieaktualny i usunięty, zamiast tego użyj wykrywania funkcji (w tym przypadku staje się bardziej skomplikowane).204 No Content
, byłby to uszkodzony obraz.Wierzę, że o to ci chodzi: jQuery.Preload
Oto przykładowy kod z wersji demo, określasz ładowanie i nie znaleziono obrazów i wszystko jest ustawione:
źródło
Źródło: http://www.developria.com/2009/03/jquery-quickie---broken-images.html
źródło
Podczas gdy OP chciał zastąpić SRC, jestem pewien, że wiele osób, które zadają to pytanie, może chcieć tylko ukryć uszkodzony obraz, w którym to przypadku to proste rozwiązanie zadziałało dla mnie świetnie.
Za pomocą wbudowanego JavaScript:
Korzystanie z zewnętrznego JavaScript:
Korzystanie z nowoczesnego zewnętrznego JavaScript:
Zobacz obsługę przeglądarki NoteList.forEach i funkcje strzałek .
źródło
Oto szybki i brudny sposób na zastąpienie wszystkich uszkodzonych obrazów i nie ma potrzeby zmiany kodu HTML;)
przykład codepen
źródło
Nie mogłem znaleźć skryptu odpowiadającego moim potrzebom, dlatego uruchomiłem funkcję rekurencyjną, aby sprawdzić uszkodzone obrazy i próbować je ładować co cztery sekundy, aż zostaną naprawione.
Ograniczyłem go do 10 prób, jak gdyby do tego czasu nie został załadowany, obraz może nie być obecny na serwerze, a funkcja wejdzie w nieskończoną pętlę. Nadal jednak testuję. Zaprojektuj to :)
źródło
To kiepska technika, ale jest prawie w pełni gwarantowana:
źródło
Możesz użyć własnego pobierania GitHub do tego:
Frontend: https://github.com/github/fetch
lub Backend, wersja Node.js: https://github.com/bitinn/node-fetch
Edycja: Ta metoda zastąpi XHR i podobno już była w Chrome. Każdy, kto to przeczyta w przyszłości, może nie potrzebować dołączonej wyżej biblioteki.
źródło
To jest JavaScript, powinien być kompatybilny z wieloma przeglądarkami i zapewnia bez brzydkich znaczników
onerror=""
:CODEPEN:
źródło
while (i--)
Lepsze połączenia przy użyciu
Ponieważ używanie
document.ready
nie musi oznaczać, że obrazy są ładowane, tylko HTML. Dlatego nie ma potrzeby opóźnionego połączenia.źródło
CoffeeScriptWariant :
Zrobiłem to, aby naprawić problem z Turbolinks, który powoduje, że metoda .error () czasami pojawia się w Firefoksie, nawet jeśli obraz naprawdę tam jest.
źródło
Korzystając z odpowiedzi Prestaul , dodałem kilka czeków i wolę używać jQuery.
źródło
Jeśli wstawiłeś swój za
img
pomocąinnerHTML
, np .:$("div").innerHTML = <img src="wrong-uri">
możesz załadować inny obraz, jeśli się nie powiedzie, np .:Dlaczego jest
javascript: _
potrzebny Ponieważ skrypty wstrzykiwane do DOM za pomocą znaczników skryptu winnerHTML
nie są uruchamiane w momencie ich wstrzykiwania, więc musisz być jawny.źródło
Znalazłem ten post, patrząc na ten inny post SO . Poniżej znajduje się kopia odpowiedzi, którą tam podałem.
Wiem, że to stary wątek, ale React stał się popularny i być może ktoś korzystający z React przyjdzie tutaj, szukając odpowiedzi na ten sam problem.
Tak więc, jeśli używasz React, możesz zrobić coś takiego jak poniżej, co było oryginalną odpowiedzią udzieloną przez Bena Alperta z zespołu React tutaj
źródło
Stworzyłem skrzypce, aby zastąpić uszkodzony obraz za pomocą zdarzenia „onerror”. To może ci pomóc.
źródło
Oto przykład użycia obiektu HTML5 Image zawiniętego przez JQuery. Wywołaj funkcję ładowania dla podstawowego adresu URL obrazu, a jeśli to obciążenie spowoduje błąd, zamień atrybut src obrazu na zapasowy adres URL.
źródło
Pure JS. Moje zadanie brzmiało: jeśli obraz „bl-once.png” jest pusty -> wstaw pierwszy (który nie ma statusu 404) obraz z listy tablic (w bieżącym katalogu):
Może trzeba to poprawić, ale:
Tak więc wstawi poprawne „potrzebne.png” do mojego src lub „no-image.png” z bieżącego katalogu.
źródło
Nie jestem pewien, czy istnieje lepszy sposób, ale mogę wymyślić sposób na hack, aby go zdobyć - możesz Ajax zamieścić na adresie URL img i przeanalizować odpowiedź, aby zobaczyć, czy obraz rzeczywiście wrócił. Jeśli wrócił jako 404 lub coś, to zamień img. Chociaż oczekuję, że będzie to dość powolne.
źródło
Rozwiązałem problem z tymi dwiema prostymi funkcjami:
źródło
jQuery 1.8
jQuery 3
odniesienie
źródło
Myślę, że mają bardziej elegancki sposób, ze delegacja wydarzenie i wydarzenie na uchwycenie
window
„serror
, nawet jeśli kopia zapasowa nie obciążenia.Chodzi o to :
Wprowadź kod
head
i jako pierwszy skrypt wbudowany. Będzie nasłuchiwać, że błędy występują po skrypcie.Użyj funkcji przechwytywania zdarzeń, aby wychwycić błędy, szczególnie w przypadku zdarzeń, które nie powodują bąbelkowania.
Użyj delegowania zdarzeń, aby uniknąć wiązania zdarzeń na każdym obrazie.
Nadaj
img
elementowi błędu atrybut po nadaniu mu znaku,backup.png
aby uniknąć zniknięciabackup.png
następnej nieskończonej pętli, jak poniżej:img error-> backup.png-> error-> backup.png-> error -> ,,,,,
źródło
let isImgErrorHandled = target.src === 'backup.png';
ponieważ to trochę upraszcza.target.src='backup.png'
ale następnym razemconsole.log(target.src)
może nie byćbackup.png
Możesz przekazać ścieżkę zastępczą i uzyskać do niej dostęp do wszystkich właściwości z uszkodzonego obiektu obrazu poprzez
$*
:http://jsfiddle.net/ARTsinn/Cu4Zn/
źródło
Frustruje mnie to od lat. Moja poprawka CSS ustawia obraz tła na
img
. Gdy obraz dynamicznysrc
nie ładuje się na pierwszym planie, symbol zastępczy jest widoczny naimg
bg. To działa, jeśli obrazy mają domyślny rozmiar (na przykładheight
,min-height
,width
i / lubmin-width
).Zobaczysz ikonę zepsutego obrazu, ale jest to ulepszenie. Pomyślnie przetestowano do wersji IE9. iOS Safari i Chrome nawet nie wyświetlają uszkodzonej ikony.
Dodaj małą animację, aby dać
src
czas na załadowanie bez migotania tła. Chrome płynnie gaśnie w tle, ale Safari na komputerze nie.źródło
Jeśli obrazu nie można załadować (na przykład dlatego, że nie ma go pod dostarczonym adresem URL), adres URL obrazu zostanie zmieniony na domyślny,
Więcej informacji o .error ()
źródło
Mam ten sam problem. Ten kod działa dobrze w moim przypadku.
źródło
Czasami użycie
error
zdarzenia jest niewykonalne, np. Ponieważ próbujesz zrobić coś na stronie, która jest już załadowana, na przykład gdy uruchamiasz kod za pomocą konsoli, skryptozakładki lub skryptu ładowanego asynchronicznie. W takim przypadku sprawdzenie tegoimg.naturalWidth
iimg.naturalHeight
są 0, wydaje się załatwić .Na przykład, oto fragment, aby ponownie załadować wszystkie uszkodzone obrazy z konsoli:
źródło
Uważam, że działa to najlepiej, jeśli którykolwiek obraz nie ładuje się po raz pierwszy, jest on całkowicie usuwany z DOM. Wykonanie
console.clear()
utrzymuje okno konsoli w czystości, ponieważ błędów 404 nie można pominąć w blokach try / catch.źródło