Обновить iFrame (проблема с кешем) - PullRequest
19 голосов
/ 26 марта 2010

У нас возникает странная проблема, из-за которой мы не уверены, что именно ее вызывает. Позвольте мне уточнить вопрос. Предположим, у нас есть две разные html-страницы a.html и b.html. И небольшой скрипт, написанный в index.html:

<html>

<head>
    <script>
    function reloadFrame(iframe, src) {
        iframe.src = src;
    }
    </script>
</head>

<body>
    <form>
        <iframe id="myFrame"></iframe>
        <input type="button" value="Load a.html" onclick="reloadFrame(document.getElementById('myFrame'), 'a.html')">
        <input type="button" value="Load b.html" onclick="reloadFrame(document.getElementById('myFrame'), 'b.html')">
    </form>
</body>

</html>

Серверный компонент постоянно обновляет оба файла: a.html и b.html. Проблема в том, что содержимое обоих файлов успешно обновляется на стороне сервера. Если мы откроем, мы увидим обновленные изменения, но клиент получит более старый контент, который не показывает обновленные изменения.

Есть идеи?

Ответы [ 5 ]

24 голосов
/ 26 марта 2010

Добавьте это в a.html и b.html

<head>
    <meta http-Equiv="Cache-Control" Content="no-cache" />
    <meta http-Equiv="Pragma" Content="no-cache" />
    <meta http-Equiv="Expires" Content="0" />
</head>

Чтобы не проверять кеш

9 голосов
/ 26 марта 2010

Если вы можете добавить серверные инструкции к этим HTML-файлам, вы можете отправить соответствующие заголовки для предотвращения кэширования:

Убедиться, что веб-страница не кэширована во всех браузерах (я думаю, что единодушным является второй ответ, а не принятый)

В ответе Симоны уже есть метатеги.

Дешевый быстрый трюк - добавить случайное число в качестве параметра GET:

page_1.html?time=102398405820

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

8 голосов
/ 02 июля 2012

Попробуйте что-то вроде следующего:

<script>
    var frameElement = document.getElementById("frame-id");
    frameElement.contentWindow.location.href = frameElement.src;
</script>

Это приведет к перезагрузке iframe, даже если он был кэширован браузером

0 голосов
/ 16 января 2014

Решение Гомеро Барбозы сработало как шарм. В моем случае на странице было разное количество фреймов, поэтому я сделал следующее:

$('.some_selector').each(function () {
  var $randid = Math.floor(Math.random() * 101);
  $(this).attr({'id': 'goinOnaSafari-' + $randid});

  var $frame = document.getElementById('goinOnaSafari-' + $randid);
  $frame.contentWindow.location.href = $frame.src;
});
0 голосов
/ 26 марта 2010

Для одного из возможных решений этого, передайте «параметр кэширования» вашим вызовам в a.html и b.html. Например

HTML

<input type="button" value="Load a.html" onclick="cacheSafeReload('a.html');">

Javascript

function cacheSafeReload(urlBase) {
    var cacheParamValue = (new Date()).getTime();
    var url = urlBase + "?cache=" + cacheParamValue;
    reloadFrame(document.getElementById('myFrame'), url);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...