2013-01-24 6 views
6

У меня есть обработчик файла ashx, который генерирует мои изображения.Динамическое сгенерированное изображение запрашивается дважды при использовании jquery ленивой загрузки в Google Chrome

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

Это все работает нормально.

Теперь, я хочу использовать ленивую загрузку. С помощью этого jquery lazy loading plugin

Так я настроил мой HTML изображение, как это:

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

И добавил следующий скрипт:

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

я заметил в вкладке Сети Google Chrome devoloper инструментов, которые есть два вызова этого обработчика файлов.

Я создал тестовую скрипку здесь: link Если вы прокрутите вниз эту скрипку, вы увидите два запроса изображения, когда изображение загрузится в Google Chrome. В Firefox и IE это работает только с одним вызовом.

Есть ли способ избежать такого поведения?

UPDATE:

следующие заголовки установлены в обработчике файла:

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

И Истекает свойство объекта Response является:

context.Response.Expires = 0 
+0

Вы можете также разместить содержимое 'ProcessRequest' обработчика изображения? Причина этого заключается в том, что поведение происходит только в том случае, если 'data-original' использует обработчик изображения (' www.mywebsite.com/action/getimage.ashx? ImageID = f8be4bf6 & width = 100 & height = 700 & bgcolor = 999'), но когда его статическое изображение, подобное 'http: // www.appelsiini.net/attachments/jquery.png', тогда есть только один вызов. –

+0

Я тоже это заметил. Статические изображения отлично работают. Обработчик файлов, используемый в примере скрипта, не является обработчиком файлов, используемым в моем собственном разрешении. Я попробовал разные обработчики файлов, которые я нашел в Интернете, чтобы узнать, не проблема ли в моем коде. Пока все они имели ту же проблему. Поэтому я не думаю, что проблема будет связана с самим обработчиком изображения. – ThdK

ответ

7

Я считаю, что проблема с корнем заключается в том, что Chrome не кэширует изображение.В этом demo Chrome выдает новый запрос каждый раз, когда вы нажимаете кнопку.

Скрипт с ленивой загрузкой запускает 2 запроса, поскольку первый (предварительно) загружает изображение в частный элемент img, а затем присваивает URL-адрес изображения исходному элементу img.

Я предлагаю добавление заголовка Expires или Cache-Control, и заголовок Last-Modified или ETag, в ответ от обработчика изображений так, что Chrome будет кэшировать изображение. (Более подробную информацию о кэшировании см Caching Tutorial for Web Authors and Webmasters.)


Update: Я предлагаю добавить что-то вроде этого в обработчик изображений (с MSDN):

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

Если он (предварительно) загружает изображение, то разве это не победит цель (ленивая) загрузка? –

+0

Загрузка «pre» происходит только тогда, когда изображение действительно видно. Я не знаю, как работают ленивые плагины, но я могу сказать, что первый вызов и второй вызов выполняются, когда изображение становится внутри окна просмотра. Я обновил свой вопрос с текущими заголовками кеширования ответа в обработчике изображений. – ThdK

+0

@ThdK На самом деле ваш комментарий подчеркивает мой ответ, что Chrome обрабатывает '$ (" img "). Attr (" src "," ")' по-другому. Если вы посмотрите в коде плагина, то строки 'line 110' и' line 115' - это единственные места, где значение атрибута 'src' устанавливается на URL-адрес обработчика изображения. В моих тестах, когда эти строки выполняются, для изображения запускается запрос. Единственное различие заключается в том, что до 'line 110'' '' скрывается. –

3

Похоже, что Google Chrome ручки $("img").attr("src", "") иначе, чем другие браузеры.

Глядя на исходный код плагина on GitHub и добавления точки останова в Chrome (шаг за шагом Собирается), звонки на обработчик изображений происходит, когда он изменяет атрибут src изображения к значению original-data.

Хотя возможно, что обработчик изображений является проблемой (как я заметил раньше), то решение, которое я нашел, чтобы изменить line 115 of the plugin's source от

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

к

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

нового значения является кодировкой base64 для прозрачного GIF-изображения 1px на 1px.

В тесте fiddle, найти в уменьшенной версии 2-го появления

c.data(h.data_attribute) 

и изменить его на

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

Это еще называет дважды, но первый вызов будет незначительным (0Kb ?) и другие браузеры не зависят от этого изменения.

+0

Почему этот ответ был опущен? Я внес изменения в плагин, а затем вижу, что второй вызов выполняется только для 1x1px. Я обсужу этот вариант с кем-то еще, чтобы узнать, можем ли мы это сделать. Я не эксперт по jQuery, поэтому я не могу понять, почему эта строка кода действительно работает, и если она на 100% безопасна для ее изменения. Поэтому, если у кого-то из вас есть другое мнение по этому поводу. Пожалуйста, дайте мне знать! Большое спасибо уже за то, что потратили свое время на этот! – ThdK

+0

Я также озадачен тем, почему Chrome ведет себя так, как это для этого плагина, но моя линия мышления состояла в том, что мы не можем изменить поведение браузера, и мы не можем изменить обработчик изображения, чтобы мы остались только с плагином , Я также не эксперт jQuery, поэтому, если вы получите окончательный ответ на это поведение, пожалуйста, разместите его здесь. :) –

+0

Что касается downvote, я понятия не имею, почему. Я думаю, что это лучшее решение, чтобы избежать запроса одного и того же изображения дважды в Chrome, если вы не захотите изменить свой ленивый плагин загрузчика (не спрашивайте меня, какая замена - я не использую никаких). –