Używam JavaScript z biblioteką jQuery do manipulowania miniaturami obrazów zawartymi na nieuporządkowanej liście. Po załadowaniu obrazu robi jedną rzecz, a gdy pojawia się błąd, robi coś innego. Używam jQuery load()
i error()
metod jako zdarzeń. Po tych zdarzeniach sprawdzam element DOM obrazu dla .complete, aby upewnić się, że obraz nie został już załadowany, zanim jQuery nie będzie mogło zarejestrować zdarzeń.
Działa poprawnie, chyba że wystąpi błąd, zanim jQuery może zarejestrować zdarzenia. Jedyne rozwiązanie, jakie mogę wymyślić, to użyć onerror
atrybutu img do przechowywania „flagi” gdzieś globalnie (lub w węźle, który jest sam), który mówi, że się nie udało, więc jQuery może sprawdzić ten „sklep / węzeł” podczas sprawdzania .complete.
Czy ktoś ma lepsze rozwiązanie?
Edycja: Pogrubione główne punkty i dodatkowe szczegóły poniżej: Sprawdzam, czy obraz jest kompletny (aka załadowany) PO dodaniu do obrazu zdarzenia obciążenia i błędu. W ten sposób, jeśli obraz zostanie załadowany przed zarejestrowaniem zdarzeń, nadal będę wiedział. Jeśli obraz nie zostanie załadowany po zdarzeniach, wydarzenia się nim zajmą. Problem polega na tym, że mogę łatwo sprawdzić, czy obraz jest już załadowany, ale nie wiem, czy zamiast tego wystąpił błąd.
źródło
Odpowiedzi:
Inną opcją jest wyzwolenie zdarzeń
onload
i / lubonerror
zdarzeń poprzez utworzenie elementu obrazu w pamięci i ustawienie jegosrc
atrybutu na oryginalnysrc
atrybut oryginalnego obrazu. Oto przykład tego, co mam na myśli:Mam nadzieję że to pomoże!
źródło
.attr
linię po.load
i.error
wierszy. W przeciwnym razie ryzykujesz załadowaniem obrazu (lub napotkaniem błędu) przed dodaniem tych wywołań zwrotnych i nie zostaną one wywołane..load()
I.error()
metody są mylące i teraz przestarzałe, stosowanie.on()
i używaćload
ierror
jak wydarzenia.Sprawdź
complete
inaturalWidth
właściwości w tej kolejności.https://stereochro.me/ideas/detecting-broken-images-js
źródło
W oparciu o moją wiedzę na temat specyfikacji HTML W3C dla tego
img
elementu , powinieneś być w stanie to zrobić za pomocą kombinacji atrybutówcomplete
inaturalHeight
, na przykład:Ze specyfikacji dla
complete
atrybutu:Zasadniczo
complete
zwraca wartość true, jeśli obraz zakończył ładowanie lub ładowanie się nie powiodło. Ponieważ chcemy tylko przypadku, w którym obraz został pomyślnie załadowany, musimy również sprawdzićnauturalHeight
atrybut:I
available
jest tak zdefiniowane:Więc jeśli obraz jest „uszkodzony” (nie udało się załadować), to będzie w stanie uszkodzonym, a nie w stanie dostępnym, więc
naturalHeight
będzie wynosił 0.Dlatego sprawdzenie
imgElement.complete && imgElement.naturalHeight !== 0
powinno nam powiedzieć, czy obraz został pomyślnie załadowany.Możesz przeczytać więcej na ten temat w specyfikacji HTML W3C dla tego
img
elementu lub w MDN .źródło
Próbowałem na wiele różnych sposobów i ten sposób był dla mnie jedynym
Możesz także dodać funkcję wywołania zwrotnego uruchamianą, gdy wszystkie obrazy zostaną załadowane do DOM i gotowe. Dotyczy to również dynamicznie dodawanych obrazów. http://jsfiddle.net/kalmarsh80/nrAPk/
źródło
Użyj
imagesLoaded
biblioteki javascript .Można go używać ze zwykłym JavaScript i jako wtyczką jQuery.
Cechy:
Zasoby
źródło
complete
właściwość nie jest wyraźnie obsługiwana: nie można znaleźć wiarygodnego źródła informacji dotyczących obsługi przeglądarki.complete
właściwość również nie wydaje się mieć jasnej specyfikacji: specyfikacja HTML5 jest jedyną, która o niej wspomina i wciąż jest w wersji roboczej w momencie pisania. Jeśli używasznaturalWidth
inaturalHeight
masz tylko obsługę IE9 +, więc jeśli używasz go, aby dowiedzieć się, czy obraz jest załadowany, potrzebujesz trochę „sprytnej” sztuczki, aby działał na starych przeglądarkach, i musisz sprawdzić, czy zachowanie w różnych przeglądarkach jest spójnePobierz informacje z elementów obrazu na stronie
Testuj działanie na Chrome i Firefox
Działający jsFiddle (otwórz konsolę, aby zobaczyć wynik)
Uwaga: Użyłem jQuery , myślałem, że może to być skuteczne przy pełnym javascript
Znajduję tutaj dobre informacje OpenClassRoom -> to francuskie forum
źródło
Detektor sieci w czasie rzeczywistym - sprawdź stan sieci bez odświeżania strony: (to nie jest jquery, ale przetestowane, i działa w 100%: (testowane w przeglądarce Firefox v25.0)
Kod:
w przypadku utraty połączenia wystarczy nacisnąć przycisk Ponownie.
Aktualizacja 1: Automatyczne wykrywanie bez odświeżania strony:
źródło
Po przeczytaniu interesujących rozwiązań na tej stronie, stworzyłem łatwe w użyciu rozwiązanie, na które duży wpływ ma post SLaksa i Noyo, który wydaje się działać na całkiem nowych wersjach (w momencie pisania) Chrome, IE, Firefox, Safari i Opera (wszystkie w systemie Windows). Ponadto działał na emulatorze iPhone / iPad, którego użyłem.
Jedną z głównych różnic między tym rozwiązaniem a SLaksem i postem Noyo jest to, że to rozwiązanie sprawdza głównie właściwości naturalWidth i naturalHeight. Przekonałem się, że w obecnych wersjach przeglądarki te dwie właściwości wydają się zapewniać najbardziej pomocne i spójne wyniki.
Ten kod zwraca PRAWDA, gdy obraz został w pełni załadowany ORAZ pomyślnie. Zwraca FAŁSZ, gdy obraz nie został jeszcze w pełni załadowany LUB LUB nie udało się załadować.
Jedną z rzeczy, o których musisz wiedzieć, jest to, że ta funkcja zwróci również FAŁSZ, jeśli obraz ma rozmiar piksela 0x0. Ale te obrazy są dość rzadkie i nie mogę wymyślić bardzo przydatnego przypadku, w którym chciałbyś sprawdzić, czy załadowano jeszcze obraz piksela 0x0 :)
Najpierw dołączamy nową funkcję o nazwie „isLoaded” do prototypu HTMLImageElement, dzięki czemu można jej użyć w dowolnym elemencie obrazu.
Następnie, za każdym razem, gdy musimy sprawdzić status ładowania obrazu, wywołujemy funkcję „isLoaded”.
Według komentarza giorgiana do postów SLaks i Noyo, to rozwiązanie prawdopodobnie może być użyte jako jednorazowa kontrola w Safari Mobile, jeśli planujesz zmienić atrybut SRC. Można jednak obejść ten problem, tworząc element obrazu z nowym atrybutem SRC zamiast zmieniać atrybut SRC na istniejącym elemencie obrazu.
źródło
Oto jak dostałem go do pracy w różnych przeglądarkach, używając kombinacji powyższych metod (musiałem także dynamicznie wstawiać obrazy do domeny):
Uwaga: Musisz podać poprawny stan logiczny dla zmiennej isIE.
źródło
// Lub jako wtyczka
źródło
Jak rozumiem, właściwość .complete jest niestandardowa. To może nie być uniwersalne ... Widzę, że wydaje się działać inaczej w wersetach Firefox IE. Ładuję kilka obrazów do javascript, a następnie sprawdzam, czy są kompletne. W Firefoksie wydaje się, że działa to świetnie. W IE nie dzieje się tak, ponieważ obrazy wydają się ładować w innym wątku. Działa tylko wtedy, gdy opóźnię moje zadanie do image.src i sprawdzę właściwość image.complete.
Użycie image.onload i image.onerror też nie działa, ponieważ muszę przekazać parametr, aby wiedzieć, o którym obrazku mówię, kiedy funkcja jest wywoływana. Jakikolwiek sposób robienia tego wydaje się zawodzić, ponieważ wydaje się, że faktycznie spełnia tę samą funkcję, a nie różne wystąpienia tej samej funkcji. Tak więc wartość, którą przekazuję, aby zidentyfikować obraz, zawsze jest ostatnią wartością w pętli. Nie mogę wymyślić żadnego sposobu na obejście tego problemu.
W Safari i Chrome widzę image.complete true i naturalWidth ustawione, nawet gdy konsola błędów pokazuje 404 dla tego obrazu ... i celowo usunąłem ten obraz, aby to przetestować. Ale powyższe działa dobrze dla Firefox i IE.
źródło
Ten fragment kodu pomógł mi naprawić problemy z buforowaniem przeglądarki:
Gdy pamięć podręczna przeglądarki jest wyłączona, tylko ten kod nie działa:
aby działało, musisz dodać:
źródło
Za pomocą tego
JavaScript
kodu możesz sprawdzić, czy obraz został pomyślnie załadowany, czy nie.Wypróbuj to
źródło
Miałem wiele problemów z pełnym ładowaniem obrazu i EventListener.
Cokolwiek próbowałem, wyniki nie były wiarygodne.
Ale potem znalazłem rozwiązanie. Technicznie nie jest to przyjemne, ale teraz nigdy nie miałem nieudanego ładowania obrazu.
Co ja zrobiłem:
Zamiast wczytywać obraz za jednym razem, ładuję go po raz drugi bezpośrednio za pierwszym razem i oba uruchamiam w module obsługi zdarzeń.
Wszystkie moje bóle głowy zniknęły!
Nawiasem mówiąc: Wy z stackoverflow pomogliście mi już ponad sto razy. Za to bardzo dziękuję!
źródło
Ten działał dla mnie dobrze :)
źródło