2012-01-06 3 views
0

У меня есть вызов AJAX, который возвращает некоторый JSON, включая некоторые URL-адреса изображений. Я хочу добавить изображения в DOM для них, но я собираюсь получать одни и те же изображения снова и снова, и я не хочу запускать свои расходы на пропускную способность. Браузер не кэширует эти изображения для меня по умолчанию - если я создаю элемент img с JQuery и добавлю его, браузер запрашивает это изображение каждый раз, когда я это делаю.предотвращение перезагрузки изображений при добавлении их с помощью JQuery append()

Поэтому я добавил кэш в виде скрытой DIV как так:

<div id="imageCache" style="display: none;"></div> 

, а затем сделал это в JQuery, когда цикл над JSON объектов возвращается с сервера, который может иметь imageKey на них:

if (post.imageKey) { 
    var cachedImage = $("#imageCache ." + post.imageKey); 

    if (cachedImage.length) { 
     var newImage = $(cachedImage).clone(); 
     $("#" + post.key).append(newImage); 
    } 
    else {     
     var newImage = $("<img src='/image?key=" + post.imageKey + "' alt='" + post.title + "' class='offeredPost " + post.imageKey + "'/>"); 
     $("#" + post.key).append(newImage); 

     cachedImage = $(newImage).clone(); 
     $("#imageCache").append(cachedImage); 
    } 
} 

Но без радости. Клонированное изображение добавляется в DOM, но затем, как только JS завершается для страницы, браузер (Chrome) создает новый запрос для изображения.

Любые идеи? Благодарю.

+0

Возможно, браузер не кэширует изображение, потому что вы используете строку запроса в SRC. Вместо этого вы можете использовать статические URL-адреса для этих изображений? – Blazemonger

+0

@ mblase75 Это только в случае изменения строки запроса. Это похоже на старый трюк добавления случайного числа в конце URL-адреса, чтобы заставить перезагружать каждый раз. Он работает только потому, что число отличается. – Archer

+0

@Archer Спасибо, я это помню - у меня просто не было достаточно информации, чтобы быть уверенным, что OP 'post.imageKey' не меняется каждый раз. Думал, что брошу его туда, чтобы он подумал. – Blazemonger

ответ

2

Используйте div с шириной и высотой, заданной шириной и высотой изображения, и используйте свойство фона для загрузки изображения ('myImage.jpg'). Используйте no-repeat, чтобы изображение не повторялось, если div больше изображения

+1

+1 и хороший трюк также должен использоваться: 'background-position: center center;' чтобы сохранить «фон» всегда в центре контейнера. –

+0

Спасибо. Похоже, что это сработает, но мне нужно знать тусклость изображения, прежде чем загружать его, что немного сложно. Глядя на то, чтобы добавить что-то серверное для этого и передать его в ответе AJAX. – Eliot

+0

не может придумать какое-либо простое решение, но вы можете устанавливать размеры div динамически каждый раз, когда вы меняете изображение. используйте вызов ajax, чтобы получить размеры изображения (библиотека php GD имеет getimagesize(), см. здесь http://www.php.net/manual/en/function.getimagesize.php) –

Смежные вопросы