Como impedir que uma solicitação do jQuery Ajax seja armazenada em cache no Internet Explorer?

275

Como impedir que uma solicitação do jQuery Ajax seja armazenada em cache no Internet Explorer?

SABU
fonte
1
Usar POST em vez de GET impede o armazenamento em cache. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta
8
As ferramentas de desenvolvimento do YSlow e Chrome alertam você se você usar solicitações POST para AJAX - geralmente GET deve ser o método preferido, a menos que você realmente precise do POST.
Pawel Krakowiak
Aqui está sua resposta: desativar o cache no IE
S.Mohamed Mahdi Ahmadian zadeh

Respostas:

524

Você pode desativar o cache globalmente usando $.ajaxSetup(), por exemplo:

$.ajaxSetup({ cache: false });

Isso anexa um carimbo de data / hora à string de consulta ao fazer a solicitação. Para desativar o cache para uma $.ajax()chamada específica , defina cache: false-o localmente, assim:

$.ajax({
  cache: false,
  //other options...
});
Nick Craver
fonte
2
Gostaria de ter visto esse item de configuração global antes. Apenas me salvou de ter que atualizar dezenas de chamadas individuais.
precisa
2
Eu sei que essa é uma resposta antiga, apenas imaginando se isso afeta todas as chamadas do tipo ajax (ajax, get e post) ou apenas chamadas específicas do ajax?
precisa saber é o seguinte
6
@Lumpy, de acordo com a documentação do jQuery.ajax () , cache: falsesó funcionará corretamente com solicitações HEAD e GET. Além disso, se você definir cache: falseem $.ajaxSetup, de acordo com jQuery.ajaxSetup documentação () , ele irá "valores padrão definidos para futuras solicitações Ajax." Portanto, sim, ele desativará o cache para todas as solicitações futuras HEAD e GET AJAX.
precisa
11
Uma palavra de cautela: isso adiciona "? _ = Somenumber" ao seu URL. Verifique se o seu back-end pode ignorar o "_" nos parâmetros de consulta do URL.
4
+1 para cache: false. Desativar o cache globalmente parece um exagero, mas ter controle por solicitação é perfeito. Obrigado
Gone Coding
21

Se você definir parâmetros exclusivos, o cache não funcionará, por exemplo:

$.ajax({
    url : "my_url",
    data : {
        'uniq_param' : (new Date()).getTime(),
        //other data
    }});
Koss
fonte
13
É isso que o cacheparâmetro já faz nos bastidores.
Jose Rui Santos
O código ajaxSetup acima não funcionou para mim, não demorou muito tempo para descobrir o porquê. Variáveis ​​globais são ruins e, às vezes, você deseja armazenar em cache. Esta resposta é melhor na minha opinião.
Bladefist
@bladefist você parece ter atingido o mesmo problema que eu. Você sabe se existem outras opções além da alteração de dados para fazer o IE parar o cache? A razão pela qual estou perguntando é que, na verdade, minhas solicitações não fazem uso de 'dados' e todos os dados acompanham o URL.
badri
1
Na verdade, isso é certamente o que o cache deve fazer nos bastidores, de acordo com essas informações - api.jquery.com/jquery.ajax cache (padrão: true, false para dataType 'script' e 'jsonp') Tipo: Booleano Se definido para false, forçará as páginas solicitadas a não serem armazenadas em cache pelo navegador. Nota: A configuração do cache como false funcionará corretamente apenas com solicitações HEAD e GET. Ele funciona anexando "_ = {timestamp}" aos parâmetros GET.
badri
@bladefist Diz claramente que anexará um timestap aos parâmetros do GET. então, por que o código fornecido pelo Koss funciona para você e a desativação do cache local ou global não?
badri
12
Cache-Control: no-cache, no-store

Esses dois valores de cabeçalho podem ser combinados para obter o efeito necessário no IE e no Firefox

Zoltan Toth
fonte
12
O problema é que o IE nem sempre escuta isso, infelizmente :)
Nick Craver
1
@ Nick, tem certeza? Eu não testei este controle de cache. O Jquery Ajax chache é compatível com todos os navegadores?
7
Ele deve funcionar em todos os navegadores, sim ... mas às vezes IE só gosta de armazenar em cache o inferno fora de coisas
Nick Craver
@ Nick - eu defino o cache do ajax como false.Mas a mensagem de sucesso do ajax não foi encontrada no IE e também no FF. Você pode verificar meu código? meu código está errado? Obrigado var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", cache: false, sucesso: função (msg) {$ ("# popup"). html (msg);}});
precisa
Acabei de confirmar que o IE11 ignora esse cabeçalho. O Chrome também lançou um erro de CORS.
Lenin
5

Aqui está uma proposta de resposta:

http://www.greenvilleweb.us/how-to-web-design/problem-with-ie-9-caching-ajax-get-request/

A idéia é adicionar um parâmetro à sua consulta ajax que contenha, por exemplo, a data e a hora atuais, para que o navegador não possa armazená-lo em cache.

Dê uma olhada no link, está bem explicado.

DRK
fonte
13
É isso que o cacheparâmetro já faz nos bastidores.
Jose Rui Santos
1

você pode defini-lo assim:

let table = $('.datatable-sales').DataTable({
        processing: true,
        responsive: true,
        serverSide: true,
        ajax: {
            url: "<?php echo site_url("your url"); ?>",
            cache: false,
            type: "POST",
            data: {
                <?php echo your api; ?>,
            }
        }

ou assim :

$.get({url: <?php echo json_encode(site_url('your api'))?>, cache: false})

espero que ajude

Fajar A. R
fonte
-4

Este é um post antigo, mas se o IE estiver causando problemas. Altere suas solicitações GET para POST e o IE não armazenará mais em cache.

Passei muito tempo descobrindo isso da maneira mais difícil. Espero que ajude.

Some_Guy
fonte
Eu não acho que você deva estar usando mal as ações HTTP. As configurações cache:falsecaso a caso são o caminho a percorrer.
tommybond