IE9 загружается из кэша (если доступно) вместо сервера при запросе xmlhttp - PullRequest
1 голос
/ 13 февраля 2012

Я развиваюсь локально.и я использую этот код для AJAX:

function getChart(num,ld,margin,idr)
{
    idr = typeof(idr) != 'undefined' ? idr : 0;
    $(ld).style.display="inline-block";
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            $(ld).style.display="none";
            //to place boxes next to each other
            $("sign_"+num).style.margin=(margin+7)+"px 590px 0 0";
            if(num=="ph"&&$("sign_fx").style.marginTop==$("sign_"+num).style.marginTop&&$("sign_fx").style.marginRight=="590px")
            {
                $("sign_"+num).style.marginRight="605px";
            }
            else if(num=="fx"&&$("sign_ph").style.marginTop==$("sign_"+num).style.marginTop&&$("sign_ph").style.marginRight=="590px")
            {
                $("sign_"+num).style.marginRight="605px";
            }
            else if(num=="fx")
            {
                $("sign_ph").style.marginRight="590px";
            }
            else if(num=="ph")
            {
                $("sign_fx").style.marginRight="590px";
            }
            $("sign_"+num).style.display="block";
            $(num+"_request_ld").style.display="none";
            $(num+"_request_all").style.display="block";
            $(num).style.display="block";
            $(num+"_request").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","barchart.php?idu=<?php echo $id_signed_in;?>&num="+num+"&idr="+idr,true);
    xmlhttp.send();
}

, когда параметры одинаковы в функции getChart (имеется в виду, что getChart был вызван с теми же параметрами), IE загружается из кэша и неНе пытайтесь вызвать сервер даже при обновлении страницы.при удалении кеша он получает данные с сервера.это потому что я развиваюсь локально ??

Ответы [ 4 ]

1 голос
/ 13 февраля 2012
  1. с использованием jQuery.ajax и установкой cache:false вместо выполнения запроса с нуля.
  2. установка Expire для вашего ответа, который генерируется barchar.php
  3. с использованием POST вместо GET, это решит вашу проблему, но не рекомендуется
0 голосов
/ 13 февраля 2012

Я нашел способ обойти это, используя «опровержение кэша», то есть добавление случайно сгенерированного числа в качестве параметра запроса.Этот параметр не должен называться так же, как все, что ожидает сервер, поэтому он будет просто проигнорирован, но он обманом заставит IE распознать его как новый запрос.

Для получения дополнительной информации см. IE Cache и AJAX: запросы Ajax для очистки кэша

0 голосов
/ 13 февраля 2012

расширяет ваш xmlhttp.open какими-то случайными данными, например, barchart.php? .... & _ Кэш = RANDVALUE Таким образом, браузер будет запрашивать данные каждый раз.

в качестве альтернативы вы должны отправлять данные, которые препятствуют, например, кешированию на стороне сервера

0 голосов
/ 13 февраля 2012

Загрузка из кеша - это функция, а не ошибка. Чтобы победить его, добавьте параметр очистки кэша, такой как

xxx= <new Date().getTime();>  // note, this is meta-code.

или просто ведите счетчик. В любом случае идентичные URL-адреса GET (включая параметры) приведут к возврату кэшированного значения. Таким образом, вы должны заставить URL-адреса быть разными.

Или используйте POST вместо GET.

Другими словами, основная идея вызовов HTTP GET состоит в том, что они идемпотентны . Это означает, что вызов (через GET) http://server.com? A = 1 & b = 2 должен всегда возвращать один и тот же ответ. Поскольку так и должно быть, ответ может (и должен) быть кэширован.

Поскольку, по-видимому, вы не возвращаете один и тот же ответ при каждом вызове, ваш URL является не идемпотентом. Это не хорошо с архитектурной точки зрения. Несмотря на то, что вы впервые столкнулись с проблемой кеша браузера, вы также можете столкнуться с проблемами с кешем в нескольких точках кэширования на пути от клиента к вашему серверу. Например, кеширующий прокси-сервер и т. Д.

Метод очистки кеша, который я описал выше (добавление изменяющегося параметра в URL), будет работать. Но лучше было бы использовать запрос POST.

Добавлена ​​

Предположения кэширования в HTTP сложны. Я упрощаю вещи, когда говорю, что URL HTTP GET должны быть идемпотентными. В зависимости от значений заголовка и тегов мета-заголовка в теле HTML, можно менять результаты с определенного URL-адреса GET. В простом случае по умолчанию браузер и промежуточные точки кэширования предполагают, что GET являются идемпотентными.

Поскольку типичные результаты простого ответа на данные не устанавливают заголовки кэширования явно, предполагается, что результаты могут быть кэшированы. Таким образом, проблема, с которой столкнулся ОП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...