В моем скрипте domotica я работаю с API для "buienradar". Он загружается на странице, но не обновляет каждое "x" время. Таким образом, API останется в цикле, который строится на первой загрузке на странице.
Как я могу изменить свой скрипт, чтобы обновлять API каждый час с помощью новой информации из Интернета /API?
BR, Jeroen
<div class="col col-md-3 col-sm-6 col-xs-12">
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">Buienradar</h3>
</div><!-- /.box-header -->
<div class="medium-box-body">
<img id="radarupdate">
</img>
</div>
</div>
</div>
<script>
$(function() { Domotica.dashboard.init(); });
$(document).ready(function() {
$('#radarupdate').attr("src","http://api.buienradar.nl/image/1.0/RadarMapNL?w=256&h=256");
setInterval(function(){
$('#radarupdate').attr("src","http://api.buienradar.nl/image/1.0/RadarMapNL?w=256&h=256");
var html = '<img border="0" src="http://api.buienradar.nl/image/1.0/RadarMapNL?w=256&h=256">';
},900000);
});
</script>
Кэширование изображений
Браузеры обычно игнорируют заголовки кеша и заголовки истечения срока действия на изображениях документов. См. Предыдущие вопросы " Почему браузеры не учитывают прослушиватели управления кешем для изображений, загруженных новыми Image() " и " Обновить изображение с новым, с тем же адресом ". К сожалению, практика защищена в стандарте HTML без возможности управления ею из сценария.
В этом вопросе радарным изображениям на сервере дается истечение кеша через 60 секунд после модификации, но содержимое изображения статично в течение 5 минут (?). Ниже приведен пример заголовка истечения кеша:
last-modified Sun, 07 Jan 2018 01:33:46 GMT
expires Sun, 07 Jan 2018 01:34:46 GMT
Изображения кэшируются в памяти и на диске. Чтение заголовков ответов для истекшего ресурса делает недействительным кеш диска, а использование хеш-компонента в URL-адресе (начиная с "#") делает недействительным кеш памяти. Chrome доволен просто отменой дискового кэша, но Firefox требует, чтобы хэш-тег также приводил к недействительности и кэш-памяти. Используя оба изображения радара, обновленного в обоих браузерах:
$(document).ready(function() {
var radarURL = "http://api.buienradar.nl/image/1.0/RadarMapNL?w=256&h=256";
var count = 0;
function readHeaders(){
$.ajax( radarURL, {
method: "HEAD",
success: updateImage
}
);
setTimeout( readHeaders, (6 - new Date().getMinutes()%5) * 60000); // see note
}
function updateImage() {
count +=1;
var differentURL = radarURL + "#" + count; // change hash component
$('#radarupdate').attr("src", differentURL);
}
readHeaders(); // first time
});
Заметка
readHeaders
устанавливает таймер для вызова себя между одной и двумя минутами после окончания текущего 5-минутного интервала в час. Это можно сделать более точным, включив секунды в расчет или изменив их, чтобы обновлять изображения реже.
Если страница загружается между обновлением изображения на сервере и окончанием 5-минутного интервала (плюс минута или две), первое обновление покажет одно и то же изображение. Второе обновление должно загружать другой GIF.
HTTP-запросы для изображения создаются с использованием опубликованного URL-адреса без дополнительных параметров запроса.