2009-12-14 1 views
2

Я хочу перезагрузить изображение на странице, если оно было обновлено на сервере. В other questions было предложено сделать что-то вродеОбновить изображение с помощью Javascript, но только если оно изменено на сервере

newImage.src = "http://localhost/image.jpg?" + new Date().getTime(); 

, чтобы заставить изображение перезаправки, но это означает, что он получит снова загружены, даже если он на самом деле не изменилось.

Есть ли какой-либо Javascript-код, который приведет к генерации нового запроса на то же изображение с правильным заголовком If-Modified-Since, чтобы изображение было загружено только в том случае, если оно действительно изменилось?

UPDATE: Я все еще смущен: если я просто запрошу типичный URL-адрес, я получу локально кэшированную копию. (если я не сделаю сервер отмеченным как кешируемое, но я не хочу этого делать, потому что вся идея состоит в том, чтобы не перегружать его, если он действительно не изменится.) Если я изменю URL-адрес, я буду всегда повторная загрузка, потому что точкой нового URL-адреса является разрыв кэша. Итак, как мне получить промежуточное поведение, которое я хочу, то есть загрузить файл, только если он не соответствует локальной кешированной копии?

+0

Если сервер правильно настроен (т. Е. Поддерживает Etag/Last-Modified), уровень клиент/прокси/кеш должен соответствовать тому, что отправил сервер. – jldupont

+0

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

+0

Если сервер настроен правильно, тогда, когда клиент запрашивает ресурс с заголовком «If-Modified-Since», сервер будет отвечать кодом статуса «304». Другими словами, клиент недостаточно спросить заголовок «If-Modified-Since», сервер также должен играть в мяч. – jldupont

ответ

1

Javascript не может прослушать событие на сервере. Вместо этого вы можете использовать какую-то форму длительного опроса или последовательные вызовы на сервер, чтобы увидеть, было ли изображение изменено.

+0

На самом деле, реализуя протокол bayeux, вы можете прослушивать событие. Не уверен, что это того стоит для OP. –

+0

Я знаю, что мне нужно опросить; в основном то, что я хочу, - это самый простой способ опроса о том, изменилось ли изображение, то есть отправить HTTP-запрос, в котором говорится: «Загрузите это изображение, если оно было изменено с момента, когда у меня есть», поэтому вопрос в том, что Javascript я могу использовать для генерации этого запроса. –

1

Вы должны взглянуть на метод xhr.setRequestHeader(). Это метод любого объекта XMLHttpRequest и может использоваться для установки заголовков в ваших запросах Ajax. В jQuery вы можете легко добавить свойство beforeSend к вашему объекту ajax и настроить там некоторые заголовки.

Это, как говорится, кеширование с помощью Ajax может быть сложным. Возможно, вам стоит взглянуть на this thread на группы Google, так как есть несколько проблем, связанных с попыткой переопределить механизмы кэширования браузера. Вам нужно будет убедиться, что ваш сервер вернет правильные заголовки управления кешем, чтобы иметь возможность заставить что-то подобное работать.

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