Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.06.2016, 22:01
Интересующийся
Отправить личное сообщение для MrBean Посмотреть профиль Найти все сообщения от MrBean
 
Регистрация: 01.06.2016
Сообщений: 22

Обновить картинку в кэше
Есть некая страница с картинкой. Картинка на сервере меняется. Браузер отображает старую картинку из кэша. Нужно заставить браузер отобразить новую картинку.

Вариант с добавлением к ссылке на картинку GET-параметров в данном случае не подходит. Копаю в направлении какого-нибудь AJAX-запроса, который может привести к обновлению кэша, но безрезультатно.
Ответить с цитированием
  #2 (permalink)  
Старый 11.06.2016, 22:11
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от MrBean Посмотреть сообщение
Вариант с добавлением к ссылке на картинку GET-параметров в данном случае не подходит.
Почему?
Ответить с цитированием
  #3 (permalink)  
Старый 11.06.2016, 22:42
Интересующийся
Отправить личное сообщение для MrBean Посмотреть профиль Найти все сообщения от MrBean
 
Регистрация: 01.06.2016
Сообщений: 22

Ссылка должна остаться без изменений, ищу альтернативные варианты.
Ответить с цитированием
  #4 (permalink)  
Старый 11.06.2016, 22:55
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

MrBean, если через добавление GET-переменных никак, то тогда через php-header можно принудительно отключить кэширование на многих прокси серверах и обозревателях сети, передав заголовки:
<?php
$fn = '/test/foo.png';
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Дата в прошлом
header('Content-Length: '.filesize($fn));
header('Content-Type: image/png');
print file_get_contents($fn);
?>

Можно и через AJAX, но заморочек будет НАМНОГО больше - не советую!

Последний раз редактировалось pureJS, 11.06.2016 в 22:57.
Ответить с цитированием
  #5 (permalink)  
Старый 12.06.2016, 00:29
Интересующийся
Отправить личное сообщение для MrBean Посмотреть профиль Найти все сообщения от MrBean
 
Регистрация: 01.06.2016
Сообщений: 22

Судя по коду, вы предлагаете отдавать картинки php-скриптом. Такой вариант не подойдет. Нужны идей с условием, что картинки и страница отдаются статикой. Пробовал как-то обыграть идею с отключением кэширования в AJAX-запросе - ничего не вышло.
Ответить с цитированием
  #6 (permalink)  
Старый 12.06.2016, 00:45
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

document.getElementById('myimg').src = 'image.jpg?' + Math.random();
Ответить с цитированием
  #7 (permalink)  
Старый 12.06.2016, 10:55
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от MrBean Посмотреть сообщение
Судя по коду, вы предлагаете отдавать картинки php-скриптом. Такой вариант не подойдет. Нужны идей с условием, что картинки и страница отдаются статикой.

MrBean, тогда можно в файле на сервере ".htaccess", который надо загрузить в папку с картинками, указать принудительный забор картинки:
Код:
<FilesMatch ".(gif|jpg|jpeg|png|ico)$">
    Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
    Header set Pragma "no-cache"
</FilesMatch>

Что почитать про кэширование через файл .htaccess:
Ответить с цитированием
  #8 (permalink)  
Старый 12.06.2016, 15:03
Интересующийся
Отправить личное сообщение для MrBean Посмотреть профиль Найти все сообщения от MrBean
 
Регистрация: 01.06.2016
Сообщений: 22

Ок, спасибо, идея с отключением кэширования понятна. Мне вот что не дает покоя: если в момент, когда браузер показывает старую картинку из кэша, открыть файл картинки напрямую в соседнем окне, картинка в кэше благополучно обновляется. Неужели это нельзя как-то сымитировать на JS? Пробовал слать всякие AJAX-запросы прямо в картинку с разными заголовками - ничего не выходит.
Ответить с цитированием
  #9 (permalink)  
Старый 12.06.2016, 15:36
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

MrBean, картинка меняется как попало есть какая-то логика?
Ответить с цитированием
  #10 (permalink)  
Старый 12.06.2016, 17:49
Интересующийся
Отправить личное сообщение для MrBean Посмотреть профиль Найти все сообщения от MrBean
 
Регистрация: 01.06.2016
Сообщений: 22

Вот что я натестил на данный момент:

WebKit: если после обновления картинки на сервере послать любой AJAX-запрос в картинку, кэш картинки обновляется. То есть трюк работает.

Gecko: здесь есть какие-то аномалии. Кэш то обновляется сам без каких-либо движений, то даже открытием картинки в соседнем окне его не пробить. Не разобрался.

Presto: открытием картинки в соседнем окне кэш обновляется. Сымитировать трюк программно не получается совсем. Трюк с AJAX-запросом работать не хочет.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как обернуть картинку в <a> c ссылкой на саму картинку ufaclub jQuery 1 17.07.2014 22:45
Скрыть div при нажатии на картинку SLameN jQuery 6 14.04.2014 21:27
Фоновую картинку поменять. Jurasmi Элементы интерфейса 11 08.10.2012 15:25
Как правильно забрать картинку с сервера? Serh AJAX и COMET 4 30.07.2012 14:05
С помощью JS добавить к ссылкам картинку в CSS wlad2 Элементы интерфейса 7 16.10.2010 23:44