How to prevent caching in Ajax requests in IE 6?

7

I have the following code to update a DIV on a page:

var req;

// FUNÇÃO BUSCA ROMANEIOS PARA EXIBIR NA TELA DE MENU.
function buscarRomaneio() {

// Verificando Browser
if(window.XMLHttpRequest) {
   req = new XMLHttpRequest();
}
else if(window.ActiveXObject) {
   req = new ActiveXObject("Microsoft.XMLHTTP");
}

// Arquivo PHP juntamente com o valor digitado no campo (método GET)
var url = "PesquisaRomaneio.php";

// Chamada do método open para processar a requisição
req.open("Get", url, true);

// Quando o objeto recebe o retorno, chamamos a seguinte função;
req.onreadystatechange = function() {

    // Exibe a mensagem "Buscando..." enquanto carrega
    if(req.readyState == 1) {
        document.getElementById('resultado').innerHTML = 'Buscando Romaneios...';
    }

    // Verifica se o Ajax realizou todas as operações corretamente
    if(req.readyState == 4 && req.status == 200) {

    // Resposta retornada pelo PesquisaRomaneio.php
    var resposta = req.responseText;

    // Abaixo colocamos a(s) resposta(s) na div resultado
    document.getElementById('resultado').innerHTML = resposta;
    }
}
req.send(null);
}
setInterval(buscarRomaneio, 60000); //Envia a informação a cada minuto

What happens is this: In any browser the function works normally. In IE6, which will be the exclusive case that I will use (data collector). The function works once and stops. I give F5 countless times and it does not change anything. It only changes if I clear the cache or zip and open the browser.

As this is a Windows CE 6, it's all very limited. Is there anything I can do in this code to solve this problem?

    
asked by anonymous 23.08.2016 / 21:43

1 answer

8

This cache problem occurred even in the most modern Internet Explorer (when using ActiveX) and sometimes occurs in other situations, varying depending on the backend result.

The practical solutions are:

  • Adjust the server cache in your PHP:

    Edit the PesquisaRomaneio.php and add this to the top, it should come first of all:

    <?php
    $g = gmdate('D, d M Y H:i:s');
    header('Expires: ' . $g . ' GMT');
    header('Last-Modified: ' . $g . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header('Pragma: no-cache');
    
    //Código restante abaixo
    
  • Add a query string suffix to avoid caching. This is the same technique that jQuery uses for when you add cache: false . Here's how:

    // Arquivo PHP juntamente com o valor digitado no campo (método GET).
    var url = "PesquisaRomaneio.php";
    
    // Adiciona ? se não tiver query string. Caso contrário adiciona &.
    url += url.indexOf("?") === -1 ? "?" : "&";
    
    // Adiciona o sufixo para evitar cache.
    url += "_=" + (new Date().getTime());
    
    // Chamada do método open para processar a requisição.
    req.open("GET", url, true);
    
  • Tip

    I recommend switching setInterval to setTimeout . This is because setInterval does not wait, which can lead to concurrent requests causing collaborative effects. Here are some answers on the subject:

    So I could change the code to something like:

    function buscarRomaneio() {
    
        // Verificando Browser
        if (window.XMLHttpRequest) {
           req = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
           req = new ActiveXObject("Microsoft.XMLHTTP");
        }
    
        // Ajusta os segundos
        var segundos = 60;
    
        // Arquivo PHP juntamente com o valor digitado no campo (método GET).
        var url = "PesquisaRomaneio.php";
    
        // Adiciona ? se não tiver query string. Caso contrário adiciona &.
        url += url.indexOf("?") === -1 ? "?" : "&";
    
        // Adiciona o sufixo para evitar cache.
        url += "_=" + (new Date().getTime());
    
        // Chamada do método open para processar a requisição.
        req.open("GET", url, true);
    
        document.getElementById('resultado').innerHTML = 'Buscando Romaneios...';
    
        req.onreadystatechange = function() {
    
            // Verifica se o Ajax realizou todas as operações corretamente
            if (req.readyState == 4) {
                if (req.status == 200) {
                    // Resposta retornada pelo PesquisaRomaneio.php
                    var resposta = req.responseText;
    
                    // Abaixo colocamos a(s) resposta(s) na div resultado.
                    document.getElementById('resultado').innerHTML = resposta;
                } else {
                    document.getElementById('resultado').innerHTML = "Erro: " + req.status;
                }
    
                setTimeout(buscarRomaneio, segundos * 1000);
            }
        };
    
        req.send(null);
    }
    
    // Inicia a função
    buscarRomaneio();
    

    This will shoot without needing the first time to wait for 60 seconds. However, if you want this wait then switch to:

        req.send(null);
    }
    
    // Inicia a função.
    setTimeout(buscarRomaneio, 60000);
    
        
    23.08.2016 / 22:24