Chcę zrobić:
$("img").bind('load', function() {
// do stuff
});
Ale zdarzenie ładowania nie jest uruchamiane, gdy obraz jest ładowany z pamięci podręcznej. Dokumenty jQuery sugerują wtyczkę, aby to naprawić, ale to nie działa
jquery
image
jquery-events
jquery-load
Tom Lehman
źródło
źródło
Odpowiedzi:
Jeśli parametr
src
jest już ustawiony, zdarzenie jest uruchamiane w zbuforowanej skrzynce, zanim jeszcze zostanie powiązana procedura obsługi zdarzenia. Aby to naprawić, możesz przejść przez sprawdzanie i wyzwalanie zdarzenia na podstawie.complete
:Zwróć uwagę na zmianę z
.bind()
na,.one()
aby moduł obsługi zdarzeń nie uruchamiał się dwukrotnie.źródło
setTimeout(function(){//do stuff},0)
ramach funkcji „load” ... 0 daje systemowi przeglądarki (DOM) jeden dodatkowy haczyk, aby upewnić się, że wszystko jest poprawnie aktualizowane..load()
nie wyzwala zdarzenia i ma 1 wymagany argument, użyj.trigger("load")
zamiast tegoCzy mogę zasugerować ponowne załadowanie go do obiektu obrazu innego niż DOM? Jeśli jest buforowany, nie zajmie to wcale czasu, a obciążenie nadal będzie działać. Jeśli nie jest przechowywany w pamięci podręcznej, wyzwoli obciążenie po załadowaniu obrazu, co powinno być w tym samym czasie, gdy zakończy się ładowanie wersji DOM obrazu.
JavaScript:
Zaktualizowano (do obsługi wielu obrazów i z poprawnie uporządkowanym załącznikiem onload):
źródło
load
moduł obsługi przed dodaniem, również to nie zadziała, ale dla jednego obrazu kod OP działa dla wielu :)#img
jest identyfikatorem, a nie selektorem elementów :)this.src
Działa również , nie trzeba używać jQuery tam, gdzie nie jest to potrzebne :) Ale tworzenie kolejnego obrazu wydaje się przesadą w obu przypadkach IMO.imageLoaded
, użyjtmp.onload = imageLoaded.bind(this)
Moje proste rozwiązanie, nie wymaga żadnej zewnętrznej wtyczki, a w typowych przypadkach powinno wystarczyć:
użyj tego w ten sposób:
na przykład, aby zanikać pod obciążeniem, możesz wykonać:
Lub alternatywnie, jeśli wolisz podejście podobne do wtyczek jquery:
i użyj go w ten sposób:
na przykład:
źródło
width
,max-height
i odchodzenieheight:auto
, często jest to konieczne, aby ustawić wysokość i szerokość tylko wtedy, gdy trzeba rozciągnąć obraz; bardziej niezawodne rozwiązanie byłoby użyć wtyczki jak ImagesLoadedCzy naprawdę musisz to zrobić z jQuery? Możesz również dołączyć
onload
wydarzenie bezpośrednio do swojego obrazu;Będzie uruchamiany za każdym razem, gdy obraz zostanie załadowany, z pamięci podręcznej lub nie.
źródło
onload
obsługi uruchomi się, gdy obraz zostanie załadowany po raz drugi z pamięci podręcznej?Możesz także użyć tego kodu z obsługą błędu ładowania:
źródło
load
obsługi, a następnie wywołanie go później weach
funkcji.Właśnie miałem ten problem, szukałem wszędzie rozwiązania, które nie wymagałoby zabicia mojej pamięci podręcznej ani pobrania wtyczki.
Nie zobaczyłem tego wątku od razu, więc zamiast tego znalazłem coś innego, co jest interesującą poprawką i (myślę) warte opublikowania tutaj:
Właściwie ten pomysł pochodzi z komentarzy tutaj: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
Nie mam pojęcia, dlaczego to działa, ale przetestowałem to na IE7 i gdzie się zepsuł, zanim teraz działa.
Mam nadzieję, że to pomoże,
Edytować
Przyjęta odpowiedź faktycznie wyjaśnia, dlaczego:
źródło
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
resetowałem oryginalne źródło.Dzięki użyciu jQuery do wygenerowania nowego obrazu za pomocą src obrazu i przypisaniu bezpośrednio do niego metody load, metoda load jest z powodzeniem wywoływana, gdy jQuery zakończy generowanie nowego obrazu. Działa to dla mnie w IE 8, 9 i 10
źródło
Rozwiązanie znalazłem https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (ten kod pochodzi bezpośrednio z komentarza)
źródło
Modyfikacja przykładu GUS:
Ustaw źródło przed i po obciążeniu.
źródło
src
przed dołączeniem programuonload
obsługi, raz wystarczy.Wystarczy ponownie dodać argument src w osobnym wierszu po zdefiniowaniu obiektu img. Spowoduje to, że IE uruchomi zdarzenie lad. To brzydkie, ale jest to najprostsze obejście, jakie do tej pory znalazłem.
źródło
Mogę dać ci małą wskazówkę, jeśli chcesz to zrobić:
Jeśli zrobisz to, gdy przeglądarka buforuje zdjęcia, nie ma problemu, że zawsze wyświetla się img, ale ładuje obraz pod prawdziwym obrazem.
źródło
Miałem ten problem z IE, w którym e.target.width byłby niezdefiniowany. Zdarzenie load zadziałałoby, ale nie mogłem uzyskać wymiarów obrazu w IE (działało chrome + FF).
Okazuje się, że musisz poszukać e.currentTarget.naturalWidth i e.currentTarget.naturalHeight .
Po raz kolejny IE robi rzeczy po swojemu (bardziej skomplikowane).
źródło
Możesz rozwiązać problem za pomocą wtyczki JAIL, która pozwala również na leniwe ładowanie obrazów (poprawa wydajności strony) i przekazywanie wywołania zwrotnego jako parametru
HTML powinien wyglądać
źródło
Jeśli potrzebujesz czystego rozwiązania CSS, ta sztuczka działa bardzo dobrze - użyj obiektu transformacji. Działa to również z obrazami, gdy są one buforowane lub nie:
CSS:
HTML:
Przykład Codepen
Przykład Codepen MNIEJ
źródło