image.onload zdarzenie i pamięć podręczna przeglądarki


113

Chcę utworzyć pole ostrzegawcze po załadowaniu obrazu, ale jeśli obraz zostanie zapisany w pamięci podręcznej przeglądarki, rozszerzenie .onload zdarzenie nie zostanie .

Jak wyzwolić alert, gdy obraz został załadowany, niezależnie od tego, czy został on zapisany w pamięci podręcznej, czy nie?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

Odpowiedzi:


153

Podczas dynamicznego generowania obrazu ustaw onloadwłaściwość przed src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle - testowane na najnowszych wersjach przeglądarek Firefox i Chrome.

Możesz również skorzystać z odpowiedzi w tym poście , którą dostosowałem dla pojedynczego dynamicznie generowanego obrazu:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

Skrzypce


Czekać. Dlaczego Twój drugi przykład kodu robi źle i ustawia się .srcprzed ustawieniem .onload? Miałeś rację w pierwszym przykładzie kodu, ale zepsułeś drugi. Drugi nie będzie działał poprawnie w niektórych wersjach IE.
jfriend00,

1
@ jfriend00 Nie, nie ma bałaganu. Kod zapasowy (drugi) jest dokładnie na wypadek, gdyby pierwszy w jakiś sposób przestał działać. =]Wykorzystuje .completesprawdzenie w przypadku, gdy obraz był już buforowany, dlatego kod to demonstrował. Oczywiście dla najlepszych praktyk zawsze można ustawić srcpóźniejsze powiązanie wszystkich programów obsługi.
Fabrício Matté,

4
Nie ma po prostu powodu, aby polegać .completew tym przypadku. Przed ustawieniem wystarczy ustawić nośnik ładunku .srci NIGDY nie jest to potrzebne. Napisałem pokaz slajdów, który jest używany przez tysiące witryn w każdej możliwej przeglądarce, a pierwsza technika działa za każdym razem. Nie ma potrzeby sprawdzania, .completekiedy tworzysz nowy obraz od zera w ten sposób.
jfriend00

W porządku, dziękuję za ostrzeżenie, zaktualizowałem odpowiedź, aby odzwierciedlić Twoje rozumowanie =]. Również @ jfriend00 czy możesz sprawdzić, czy obraz ładuje się w IE? Zastanawiam się, czy jest to problem z moją siecią, czy z IE i obrazem.
Fabrício Matté

9
Również dzisiaj stwierdziłem, że webkit potrzebuje img.src = ''przed przypisaniem nowego src, jeśli był wcześniej używany.
quux

10

Jeśli src jest już ustawiony, zdarzenie jest wyzwalane w przypadku w pamięci podręcznej, zanim nawet zostanie powiązana procedura obsługi zdarzeń. Więc powinieneś wyzwolić zdarzenie .completerównież na podstawie .

przykładowy kod:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

Istnieją dwa możliwe rozwiązania tego rodzaju sytuacji:

  1. Skorzystaj z rozwiązania sugerowanego w tym poście
  2. Dodaj unikalny przyrostek do obrazu src aby wymusić ponowne pobranie go przez przeglądarkę, na przykład:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

W tym kodzie za każdym razem, gdy dodajesz aktualną sygnaturę czasową na końcu adresu URL obrazu, nadasz mu unikalny charakter, a przeglądarka ponownie pobierze obraz


44
Wszystko to pokonuje buforowanie. To NIEPRAWIDŁOWY sposób rozwiązania tego problemu. Właściwy sposób znajduje się w odpowiedzi Fabricio. Po prostu ustaw .onloadmoduł obsługi przed ustawieniem .srcwartości, a nie przegapisz zdarzenia onload w niektórych wersjach IE.
jfriend00

1
tak, masz rację, ale nie zawsze buforowanie jest pożądane, czasami obrazy nie powinny być buforowane. oczywiście w tej konkretnej sytuacji zależy to od potrzeb
haynar

1
W mojej aplikacji kątowej próbowałem wszystkiego, co mówią inne odpowiedzi, ale nie pomogło. Ale wymuszanie, aby nie zapisywać w pamięci podręcznej, jak ta odpowiedź, działa dla mnie. Więc plus jeden ode mnie.
Thanu,

Jedyne rozwiązanie, które działało u mnie w najnowszej wersji Chrome.
Młody Bob

3

Spotkałem się dzisiaj z tym samym problemem. Po wypróbowaniu różnych metod zdaję sobie sprawę, że umieszczenie kodu rozmiaru w środku $(window).load(function() {})zamiast document.readyrozwiązałoby część problemu (jeśli nie AJAXUJESZ strony).


To również dobra odpowiedź na sytuację, w której przeglądarka ma buforowany obraz, działa dobrze z ładowaniem okna
Shocker

dokładnie to, z czym miałem do czynienia. zmiana, $(document).readyaby $(window).loadrozwiązać mój problem.
Tariqul Islam

0

Odkryłem, że możesz to zrobić po prostu w Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

Ustawienie samego .src wyzwoli zdarzenie onload.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.