Javascript 阻止浏览器缓存AJAX请求
我已经安装了一个应用程序,它在Opera和Firefox上运行得非常好,但在GoogleChrome上它会缓存AJAX请求并提供过时的数据 是应用程序。在Chrome中运行时,它甚至不发送AJAX请求,但在另一个浏览器中尝试时,它总是执行AJAX请求并返回数据 是否有任何方法(Apache/PHP/HTML/JS)阻止Chrome执行此行为? AJAX调用:Javascript 阻止浏览器缓存AJAX请求,javascript,ajax,google-chrome,Javascript,Ajax,Google Chrome,我已经安装了一个应用程序,它在Opera和Firefox上运行得非常好,但在GoogleChrome上它会缓存AJAX请求并提供过时的数据 是应用程序。在Chrome中运行时,它甚至不发送AJAX请求,但在另一个浏览器中尝试时,它总是执行AJAX请求并返回数据 是否有任何方法(Apache/PHP/HTML/JS)阻止Chrome执行此行为? AJAX调用: function sendAjax(action,domain,idelement) { //C
function sendAjax(action,domain,idelement) {
//Create the variables
var xmlhttp,
tmp,
params = "action=" + action
+ "&domain=" + encodeURIComponent(domain)
xmlhttp = new XMLHttpRequest();
//Check to see if AJAX request has been sent
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
$('#'+idelement).html(xmlhttp.responseText);
}
};
xmlhttp.open("GET", "ajax.php?"+params, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//console.log(params);
xmlhttp.send(params);
}
sendAjax('gapps','example.com','gapps');
浏览器缓存在不同设置下的行为不同。您不应依赖于用户设置或用户浏览器。也可以使浏览器忽略标题 有两种方法可以防止缓存 -->将AJAX请求更改为POST。浏览器不会缓存POST请求 -->更好的方法&更好的方法:使用当前时间戳或任何其他唯一数字向请求中添加一个附加参数
params = "action=" + action
+ "&domain=" + encodeURIComponent(domain)
+ "&preventCache="+new Date();
Javascript解决方案的另一个替代方案是使用自定义标题: 在PHP中,它将如下所示:
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");//Dont cache
header("Pragma: no-cache");//Dont cache
header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");//Make sure it expired in the past (this can be overkill)
?>
下面的代码行对我很有用
$.ajaxSetup({ cache: false });
遇到这个问题时,我正在使用jQueryAjax请求 根据添加“cache:false”添加了一个时间戳,如接受答案中所述: 这只适用于GET和HEAD请求,但如果您使用POST浏览器,则无论如何都不会缓存ajax请求。对于IE8有一个but,如果需要,请在链接中查看它
$.ajax({
type: "GET",
cache: false,
});
PHP脚本返回的标题是什么?请确保它们不允许缓存,并返回适当的内容类型。我本来以为这是一个解决方案,但我认为它不雅观,好的,谢谢!:)只是为了信息和心灵的平静。当您说preventCache到ajax调用时,主要框架都使用了这个解决方案,其中一个例子是DOJO。把日期改成数字真的吗?对我来说,这似乎是一种“黑客”方法,它很有效(很棒),但我本以为会有一种更好的方法,作为“官方”方法。再次感谢!:)这是一个老问题,但它仍然出现在我的谷歌搜索查询的前三名结果中。发送自定义服务器头(来自@Mattisdada的回复)是永远不应该缓存的文件的最佳方式。对于偶尔需要刷新的静态文件,请发送一个带有要加载的文件版本的参数(例如,
params+='&preventCache=1.0.1'
),而不是当前时间戳。缓存仍然有效,更改版本字符串将刷新文件。这是否适用于所有浏览器?如果是这样的话,这比查询参数hack要优雅得多。。。