2013-01-24 15 views
6

Mam obsługę plików w formacie ashx, która generuje moje obrazy.Dynamiczne generowanie obrazu jest wymagane dwukrotnie podczas korzystania z leniwego ładowania jquery w przeglądarce Google Chrome

<img src="www.mywebsite.com/action/getimage.ashx?imageID=f8be4bf6&width=100&height=700&bgcolor=999" /> 

Wszystko działa dobrze.

Teraz chcę użyć leniwego ładowania. Stosując ten jquery lazy loading plugin

Więc regulować moje obrazy HTML tak:

<img src="imageplaceholder.gif" original-data="www.mywebsite.com/action/getimage.ashx?imageID=f8be4bf6&width=100&height=700&bgcolor=999" /> 

I dodaje następujący skrypt:

$(function() { 
    $("img").lazyload(); 
}); 

zauważyłem na karcie sieciowej google narzędzi chrom devoloper że istnieją dwa wywołania do tego filehandlera.

Stworzyłem testowe skrzypce tutaj: link Po przewinięciu tego skrzypka zobaczysz dwa żądania obrazków, gdy obraz zostanie załadowany do przeglądarki Google Chrome. W Firefox i IE działa tylko z jednym połączeniem.

Czy istnieje sposób na uniknięcie takiego zachowania?

UPDATE:

Następujące nagłówki są ustawione w module obsługi plików:

[0] "Server" "Microsoft-IIS/7.5" 
[1] "Set-Cookie" "lang=nl; expires=Tue, 04-Feb-2014 13:08:56 GMT; path=/" 

A Wygasa właściwość obiektu Response to:

context.Response.Expires = 0 
+0

można również dodawać zawartość 'ProcessRequest' obsługi obrazu? Powodem tego jest to, że zachowanie występuje tylko wtedy, gdy 'data-original' używa programu obsługi obrazu (' www.mywebsite.com/action/getimage.ashx? ImageID = f8be4bf6 & width = 100 & height = 700 & bgcolor = 999'), ale gdy jest to obraz statyczny, taki jak 'http: // www.appelsiini.net/attachments/jquery.png', jest tylko jedno połączenie. –

+0

Też to zauważyłem. Obrazy statyczne działają dobrze. Procedura obsługi pliku użyta w przykładowym skrzypce nie jest obsługiwana w moim własnym rozwiązaniu. Próbowałem różnych programów do obsługi plików znalezionych w Internecie, aby sprawdzić, czy problem nie jest związany z moim kodem. Do tej pory wszyscy mieli ten sam problem. Więc nie sądzę, że problem będzie dotyczył samej obsługi obrazu. – ThdK

Odpowiedz

7

Uważam, że głównym problemem jest to, że Chrome nie buforuje obrazu.W tej wersji demo Chrome wyśle ​​nowe żądanie za każdym razem, gdy klikniesz przycisk.

Skrypt leniwy obciążenie wyzwala 2 wnioski, ponieważ pierwszy (pre) ładuje obraz do prywatnej img elementu, to przydziela adres URL obrazu do oryginalnego img elementu.

Proponuję dodanie Expires lub Cache-Control nagłówek, a Last-Modified lub ETag nagłówek, do reakcji ze swojej obsługi obrazu tak, że Chrome będzie buforować obrazu. (Więcej informacji na temat buforowania, zobacz Caching Tutorial for Web Authors and Webmasters.)


Aktualizacja: Proponuję dodanie czegoś podobnego do obsługi obrazu (od MSDN):

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
Response.Cache.SetCacheability(HttpCacheability.Public); 
Response.Cache.SetValidUntilExpires(true); 
+0

Jeśli to (pre) ładuje obraz, to czy nie zniszczyłoby to celu (leniwego) ładowania? –

+0

Ładunek "pre" ma miejsce tylko wtedy, gdy obraz jest rzeczywiście widoczny. Nie wiem, jak naprawdę działają leniwe wtyczki ładujące, ale mogę stwierdzić, że zarówno pierwsze, jak i drugie połączenie są wykonywane, gdy obraz znajdzie się w widocznym obszarze. Zaktualizowałem moje pytanie z bieżącymi nagłówkami buforowania odpowiedzi w mojej procedurze obsługi obrazu. – ThdK

+0

@ThdK Właściwie twój komentarz podkreśla moją odpowiedź, że Chrome obsługuje '$ (" img "). Attr (" src "," ")' inaczej. Jeśli spojrzysz w kod wtyczki, 'line 110' i' line 115' są jedynymi miejscami, w których wartość atrybutu 'src' jest ustawiona na adres url obrazu. W moich testach, kiedy te linie są wykonywane, żądanie jest uruchamiane dla obrazu. Jedyna różnica polega na tym, że przed 'linią 110'' '' zostaje ukryta. –

3

Wydaje się, że uchwyty Google Chrome $("img").attr("src", "") inaczej niż inne przeglądarki.

Patrząc na kod źródłowy wtyczki on GitHub i dodając punkt przerwy w Chrome (idąc krok po kroku), wywołania do obsługi obrazu występuje, gdy modyfikuje atrybut src obrazu do wartości original-data.

Chociaż możliwe jest, że procedura obsługi obraz jest problem (jak zauważył wcześniej), rozwiązanie, które znalazłem zmienić line 115 of the plugin's source z

.attr("src", $self.data(settings.data_attribute)); 

do

.attr("src", "data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="); 

nowej wartości to łańcuch kodowany base64 dla przezroczystego obrazu GIF 1px na 1px.

W swoim badaniu fiddle, odnaleźć w wersji minified 2nd wystąpienie

c.data(h.data_attribute) 

i zmienić go na

"data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" 

będzie nadal dzwonić dwa razy, ale pierwsza rozmowa będzie nieznaczny (0KB ?) i ta zmiana nie ma wpływu na inne przeglądarki.

+0

Dlaczego ta odpowiedź została odrzucona? Wprowadziłem twoją zmianę w wtyczce, a potem widzę, że drugie połączenie jest wykonane tylko dla 1x1px. Omówię tę opcję z kimś tutaj, aby sprawdzić, czy to jest coś, co możemy zrobić. Nie jestem ekspertem od jquery, więc naprawdę nie mogę się dowiedzieć, dlaczego ta linia kodu naprawdę działa i czy jest w 100% bezpieczna, aby to zmienić. Więc jeśli ktoś z was ma inne zdanie na ten temat. Proszę daj mi znać! Wielkie dzięki za spędzanie czasu na tym! – ThdK

+0

Jestem także zaskoczony, dlaczego Chrome zachowuje się jak ta dla tej wtyczki, ale moim zdaniem nie można zmienić zachowania przeglądarki i nie możemy zmienić programu obsługi obrazu, więc pozostajemy tylko z wtyczką . Nie jestem też ekspertem jQuery, więc jeśli uzyskasz rozstrzygającą odpowiedź na to zachowanie, proszę również umieść to tutaj. :) –

+0

Co do upadku, nie mam pojęcia dlaczego. Uważam, że jest to najlepsze rozwiązanie, aby uniknąć dwukrotnego żądania tego samego obrazu w Chrome, chyba że chcesz zmienić wtyczkę leniwego programu ładującego (nie pytaj mnie o to, co zastępuję - nie używam żadnego). –

Powiązane problemy