Pergunta

Parece que se eu carregar conteúdo dinâmico usando $.get(), o resultado é armazenado em cache no navegador.

Adicionando alguns seqüência aleatória no QueryString parece resolver esta questão (eu uso new Date().toString()), mas este se sente como um hack.

Existe alguma outra maneira de conseguir isso? Ou, se string única é a única maneira de conseguir isso, quaisquer outros do que new Date() sugestões?

Foi útil?

Solução

Eu uso new Date().getTime(), o que irá evitar colisões menos que você tenha várias solicitações que acontecem dentro do mesmo milissegundo:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

Editar: Esta resposta é vários anos de idade. Ele ainda funciona (daí eu não excluiu-lo), mas Há maneiras melhores / mais limpas de conseguir isso agora . Minha preferência é para este método , mas esta resposta também é útil se você quiser desabilitar o cache para todas pedido durante o tempo de vida de uma página.

Outras dicas

A seguir irá prevenir todos os pedidos futuro AJAX de ser armazenado em cache, independentemente de qual método jQuery você usa ($ .get, $ .ajax, etc.)

$.ajaxSetup({ cache: false });

$ .get de JQuery () irá armazenar em cache os resultados. Em vez de

$.get("myurl", myCallback)

você deve usar $ .ajax, o que lhe permitirá ligar o cache off:

$.ajax({url: "myurl", success: myCallback, cache: false});

outra maneira é fornecer nenhum cabeçalhos de cache do lado do servidor no código que gera a resposta para ajax chamada:

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );

Todas as respostas aqui deixar uma pegada no URL pedido que vai aparecer nos logs de acesso do servidor.

I necessário uma solução à base de cabeçalho sem o efeito secundário e I que pode ser conseguida por criação dos cabeçalhos mencionadas em Como controlar página web caching, em todos os navegadores? .

O resultado, trabalhando para o Chrome, pelo menos, seria:

$.ajax({
   url: url, 
   headers: {
     'Cache-Control': 'no-cache, no-store, must-revalidate', 
     'Pragma': 'no-cache', 
     'Expires': '0'
   }
});

Pessoalmente, sinto que o método string de consulta é mais confiável do que tentar cabeçalhos definidos no servidor - não há nenhuma garantia de que um proxy ou o navegador não vai apenas cache-lo de qualquer maneira (alguns navegadores são piores do que os outros - sem citar nomes) .

Eu costumo usar Math.random() mas eu não vejo nada de errado em usar a data (você não deveria estar fazendo solicitações de AJAX rápido o suficiente para obter o mesmo valor duas vezes).

A seguir a documentação: http://api.jquery.com/jquery.ajax/

Você pode usar a propriedade cache com:

$.ajax({
    method: "GET",
    url: "/Home/AddProduct?",
    data: { param1: value1, param2: value2},
    cache: false,
    success: function (result) {
        // TODO
    }
});

Claro técnicas "de quebra de cache" vai começar o trabalho feito, mas isso não iria acontecer, em primeiro lugar, se o servidor indicado para o cliente que a resposta não deve ser armazenada em cache. Em alguns casos, é benéfico para respostas de cache, algumas vezes, não. Deixe o servidor decidir a vida útil correta dos dados. Você pode querer mudá-lo mais tarde. Muito mais fácil de fazer a partir do servidor do que de muitos lugares diferentes em seu código de interface do usuário.

É claro que isso não ajuda se você não tem nenhum controle sobre o servidor.

Que tal usar uma solicitação POST em vez de um GET ...? (Que você deve de qualquer maneira ...)

A verdadeira questão é por que você precisa esta não deve ser armazenado em cache. Se ele não deve ser armazenado em cache porque muda o tempo todo, o servidor deve especificar para não armazenar em cache o recurso. Se ela apenas muda às vezes (porque um dos recursos de que depende a mudança pode), e se o código do cliente tem uma maneira de saber sobre isso, é possível anexar um parâmetro fictício para o url que é calculado a partir de alguns hash ou data da última modificação desses recursos (que é o que fazemos em recursos de script Microsoft Ajax para que eles possam ser armazenados em cache para sempre, mas novas versões ainda pode ser servido como eles aparecem). Se o cliente não pode saber de mudanças, a maneira correta deve ser para o servidor para solicitações identificador de cabeça corretamente e dizer ao cliente se deve usar a versão em cache ou não. Parece-me que anexando um parâmetro aleatório ou contar a partir do cliente nunca cache é errado porque cacheability é uma propriedade do recurso do servidor, e assim deve ser decidido no lado do servidor. Outra questão a se perguntar é deve este recurso realmente ser servido através de GET ou deve passar por POST? Essa é uma questão de semântica, mas também tem implicações de segurança (há ataques que o trabalho apenas se o servidor permite GET). POST não vai ficar em cache.

Talvez você deve olhar para $ .ajax () em vez (se você estiver usando jQuery, que parece que). Dê uma olhada em: http://docs.jquery.com/Ajax/jQuery.ajax #options ea opção "cache".

Outra abordagem seria a de olhar em como você armazenar em cache as coisas no lado do servidor.

Uma pequena além das excelentes respostas dadas: Se você está correndo com uma solução de backup não-ajax para usuários sem javascript, você terá que obter os cabeçalhos do lado do servidor corrigir qualquer maneira. Isso não é impossível, embora eu entendo aqueles que desistir dele;)

Eu tenho certeza que há uma outra pergunta sobre SO que lhe dará o conjunto completo de cabeçalhos que são apropriados. Não estou miceus inteiramente conviced responder abrange todas as bases de 100%.

Para aqueles de vocês usando a opção cache de $.ajaxSetup() no Safari móvel, parece que você pode ter que usar um timestamp dos Correios, desde móvel Safari caches isso também. De acordo com a documentação sobre $.ajax() (que você será direcionado para a partir $.ajaxSetup()):

Configuração de cache para false só vai funcionar corretamente com HEAD e solicitações GET. Ele funciona através da anexação "_ = {timestamp}" para os parâmetros GET. O parâmetro não é necessário para outros tipos de solicitações, exceto no IE8 quando um POST é feita para um URL que já tenha sido solicitada por um GET.

Assim, definindo a opção por si só não vai ajudá-lo no caso que mencionei acima.

Basicamente basta adicionar cache:false; no ajax onde você acha que o conteúdo vai mudar como o go progresso. E o lugar onde o conteúdo não vai mudar lá u pode omitir isso. Desta forma vai obter a nova resposta cada vez

de

Internet Explorer Ajax Caching: O que você vai fazer sobre ele ? sugere três abordagens:

  1. Adicionar um cache rebentando token para a string de consulta, como? Date = [timestamp]. Em jQuery e YUI pode dizer-lhes para fazer isso automaticamente.
  2. Use POST em vez de um GET
  3. Enviar um cabeçalho de resposta HTTP que especificamente proíbe navegadores para armazenar em cache-lo

Agora, é fácil fazê-lo, permitindo / opção de cache incapacitante em sua solicitação ajax, como este

$(function () {
    var url = 'your url goes here';
    $('#ajaxButton').click(function (e) {
        $.ajax({
            url: url,
            data: {
                test: 'value'
            },
                cache: true, //cache enabled, false to reverse
                complete: doSomething
            });
        });
    });
    //ToDo after ajax call finishes
    function doSomething(data) {
        console.log(data);
    }
});

Se você estiver usando o IE 9, então você precisa usar o seguinte na frente de sua definição de classe controlador:

[OutputCache (NoStore = true, Duração = 0, VaryByParam = "*")]

classe pública TestController: Controlador

Isso impedirá que o navegador do armazenamento em cache.

detalhes neste link: http: //dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

Na verdade isso resolveu o meu problema.

Como @Athasach disse, de acordo com os docs jQuery, $.ajaxSetup({cache:false}) não vai funcionar para que não seja GET e HEAD pedidos.

Você é melhor fora de enviar de volta um cabeçalho Cache-Control: no-cache de seu servidor de qualquer maneira. Ele fornece uma separação mais clara de preocupações.

Claro, isso não iria funcionar para URLs de serviço que você não pertence ao seu projeto. Nesse caso, você pode considerar o proxy do serviço de terceiros a partir do código do servidor, em vez de chamá-lo de código do cliente.

Se você estiver usando .net ASP MVC, desativar o cache na ação do controlador, adicionando o seguinte atributo na função ponto final: [OutputCacheAttribute (VaryByParam = "*", Duração = 0, NoStore = true)]

append Math.random () para a solicitação url

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top