2013-02-14 12 views
6

Aby wykryć, kiedy pobieranie zostało zakończone, której metody należy użyć?Jaki jest najlepszy sposób wykrywania pobierania obrazu - onload lub addEventListener()?

image.onload = function() {} 

lub

image.addEventListener("load", function() {}); 
+0

, chyba że bardzo się pomylę, są one bardzo podobne do tego, co można uzyskać pod tym adresem: – Popnoodles

+0

http://stackoverflow.com/questions/6902033/element-onload-vs-element-addeventlistenerload-callbak-false - Właśnie to znalazłem. –

+0

Sprawdź tajniki obu, a następnie zdecyduj, których użyć w zależności od sytuacji. –

Odpowiedz

8

onload:

  1. obsługuje tylko jeden słuchacza.
  2. Działa we wszystkich przeglądarkach.
  3. Rozprzęgniesz obsługę zdarzeń, usuwając właściwość onload.

addEventListener:

  1. Obsługa wielu słuchaczy.
  2. Nie działa w starszych przeglądarkach IE (używają one attachEvent).
  3. Rozprzęgniesz słuchacza za pomocą removeEventListener(), który wymaga informacji identyfikujących oryginalny eventListener.

Jeśli addEventListener jest obsługiwany i trzeba tylko jednego słuchacza, a następnie można użyć albo.

Jeśli jest to prosty samodzielny fragment kodu, z którym nikt nie będzie się borykał, nie ma problemu z używaniem onload. Jeśli jest to bardziej złożone oprogramowanie, z którym inni deweloperzy mogą mieć problemy i wymagana jest dowolna elastyczność, a masz obsługę wielu przeglądarek dla detektorów zdarzeń, wówczas addEventListener() jest bardziej elastyczny i prawdopodobnie bardziej pożądany.

+0

Warto zauważyć, że rozłączenie jest prostsze dzięki właściwości 'onload'. –

+0

@thesystem - działa również 'removeEventListener' i nigdy nie spotkałem się z żadnym powodem, aby odłączyć obsługę zdarzeń load dla obrazu. W każdym razie dodam tę różnicę. – jfriend00

+0

@pure_code - Nie sądzę, że jest coś złego w korzystaniu z 'onload' w niektórych sytuacjach, szczególnie gdy chce się obsługiwać starsze przeglądarki IE i nie ma już biblioteki zdarzeń z przeglądarki krzyżowej (jak w prostym autonomicznym widgecie). Z pewnością 'addEventListener()' jest bardziej elastyczny (obsługuje wiele detektorów). – jfriend00

1

image.addEventListener("load", function() {}); nie będzie działać na wszystkich przeglądarkach, ale zakładając, że masz kopię zapasową i używać image.attachEvent("onload", function() {})

if(image.addEventListener) { image.addEventListener("load",function() {}); } 
else { image.attachEvent("onload", function() {}); } 

ten będzie miał tę zaletę, że nie istnieją nadrzędne dowolne zdarzenie onload, który już istnieje na obrazek, a zdarzenie onload nie zostanie nadpisane przez żaden inny kod.

bezpośrednią modyfikację „onload” atrybut DOM element jest zwykle zalecane, ponieważ nie tylko można pomyśleć: „Hej, mogę zaoszczędzić kilka linijek kodu, ustawiając go, a ja potrzebuję tylko jednego słuchacza, więc będę po prostu ustaw to zamiast używania addEventListener/attachEvent "- ale niezmiennie prowadzi to do" No co, jeśli muszę dodać coś później? "

Z tego powodu programiści javascript zwykle używają biblioteki do przyłączania zdarzeń, więc można pewnie dodać słuchacza za pomocą jednego wiersza kodu i będzie on działał we wszystkich przeglądarkach.

2

spróbować

if(image.complete){ 
    //.... 
} 
1

obu, Image.complete jak również image.onload nie wydają się działać w Webkit, przynajmniej w wersji na mojej komórce. Zwracają one nieskończenie liczbę false. Działa w operze, więc kod może być w porządku.

Dlatego używam obecnie sztuczki działającej przynajmniej w operze i webkicie.Mam gotowy obraz zastępczy piksela 1x1. Teraz ustawiam src na obraz, który ma być załadowany i (zazwyczaj jest to zła praktyka, ale jest to gra, której nie można uruchomić bez tego obrazu) Wchodzę w pętlę, która aktualizuje niektóre "ładowanie" ekranu gfx, ale po prostu sprawdza szerokość obrazu, czy image.width jest większy niż 1 piksel.

Tak jak powiedziałem, przetestowałem tylko z operą i webkitem. Używam go do ładowania obrazu atlasu i kopiowania zawierających go płytek do poszczególnych obrazów na płótnie. Po zakończeniu obraz atlasu src zostaje przywrócony do symbolu zastępczego 1x1, dzięki czemu można go ponownie użyć w ten sposób. Dla pełnego savity, należy również poczekać, aż symbol zastępczy ma 1 piksel w szerokości ponownie, przed ponownym użyciem w ten sposób.

Powiązane problemy