我有以下代码在网址上发出GET请求:
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val());
});
但返回的结果并不总是反映出来。例如,我更改了堆栈跟踪的响应,但是当我单击搜索按钮时没有出现堆栈跟踪。我查看了控制ajax响应的底层PHP代码,它有正确的代码,直接访问页面显示正确的结果,但.load返回的输出是旧的。
如果我关闭浏览器并重新打开它,它会运行一次,然后开始返回陈旧信息。我可以通过jQuery控制它,还是需要我的PHP脚本输出头来控制缓存?
答案 0 :(得分:413)
如果要基于每个请求控制缓存,则必须使用更复杂的函数,如$.ajax()
。或者,如果您只想将其关闭,请将其放在脚本的顶部:
$.ajaxSetup ({
// Disable caching of AJAX responses
cache: false
});
答案 1 :(得分:107)
以下是如何基于每个请求控制缓存的示例
$.ajax({
url: "/YourController",
cache: false,
dataType: "html",
success: function(data) {
$("#content").html(data);
}
});
答案 2 :(得分:35)
一种方法是在网址末尾添加唯一编号:
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());
你在每次调用时写下uniqueId()以返回不同的东西。
答案 3 :(得分:8)
另一种只在需要从服务器获取数据时才放下线的方法,将下面的行与您的ajax网址一起添加。
'?_ =' + Math.round(的Math.random()* 10000)
答案 4 :(得分:6)
/**
* Use this function as jQuery "load" to disable request caching in IE
* Example: $('selector').loadWithoutCache('url', function(){ //success function callback... });
**/
$.fn.loadWithoutCache = function (){
var elem = $(this);
var func = arguments[1];
$.ajax({
url: arguments[0],
cache: false,
dataType: "html",
success: function(data, textStatus, XMLHttpRequest) {
elem.html(data);
if(func != undefined){
func(data, textStatus, XMLHttpRequest);
}
}
});
return elem;
}
答案 5 :(得分:5)
Sasha是个好主意,我使用混合物。
我创建了一个函数
LoadWithoutCache: function (url, source) {
$.ajax({
url: url,
cache: false,
dataType: "html",
success: function (data) {
$("#" + source).html(data);
return false;
}
});
}
并调用我的页面的不同部分,例如在init:
初始化:函数(actionUrl1,actionUrl2,actionUrl3){
var ExampleJS = {
Init: function (actionUrl1, actionUrl2, actionUrl3) ExampleJS.LoadWithoutCache(actionUrl1, "div1");
ExampleJS.LoadWithoutCache(actionUrl2,“div2”); ExampleJS.LoadWithoutCache(actionUrl3,“div3”); } },
答案 6 :(得分:4)
这在IE中尤其令人烦恼。基本上,您必须使用服务器的响应发回“无缓存”HTTP标头。
答案 7 :(得分:3)
对于PHP,请将此行添加到提供所需信息的脚本中:
header("cache-control: no-cache");
或者,在查询字符串中添加唯一变量:
"/portal/?f=searchBilling&x=" + (new Date()).getTime()
答案 8 :(得分:2)
请勿使用时间戳来创建唯一的URL,因为您访问的每个页面都由jquery mobile缓存在DOM中,您很快就会遇到移动设备内存不足的问题。
$jqm(document).bind('pagebeforeload', function(event, data) {
var url = data.url;
var savePageInDOM = true;
if (url.toLowerCase().indexOf("vacancies") >= 0) {
savePageInDOM = false;
}
$jqm.mobile.cache = savePageInDOM;
})
此代码在加载页面之前激活,您可以使用url.indexOf()来确定URL是否是您要缓存的URL,并相应地设置缓存参数。
不要使用window.location =“”;更改URL,否则您将导航到该地址,pagebeforeload将不会触发。为了解决这个问题,只需使用window.location.hash =“”;
答案 9 :(得分:1)
您可以使用缓存设置为false的版本替换jquery加载函数。
(function($) {
var _load = jQuery.fn.load;
$.fn.load = function(url, params, callback) {
if ( typeof url !== "string" && _load ) {
return _load.apply( this, arguments );
}
var selector, type, response,
self = this,
off = url.indexOf(" ");
if (off > -1) {
selector = stripAndCollapse(url.slice(off));
url = url.slice(0, off);
}
// If it's a function
if (jQuery.isFunction(params)) {
// We assume that it's the callback
callback = params;
params = undefined;
// Otherwise, build a param string
} else if (params && typeof params === "object") {
type = "POST";
}
// If we have elements to modify, make the request
if (self.length > 0) {
jQuery.ajax({
url: url,
// If "type" variable is undefined, then "GET" method will be used.
// Make value of this field explicit since
// user can override it through ajaxSetup method
type: type || "GET",
dataType: "html",
cache: false,
data: params
}).done(function(responseText) {
// Save response for use in complete callback
response = arguments;
self.html(selector ?
// If a selector was specified, locate the right elements in a dummy div
// Exclude scripts to avoid IE 'Permission Denied' errors
jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
// Otherwise use the full result
responseText);
// If the request succeeds, this function gets "data", "status", "jqXHR"
// but they are ignored because response was set above.
// If it fails, this function gets "jqXHR", "status", "error"
}).always(callback && function(jqXHR, status) {
self.each(function() {
callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
});
});
}
return this;
}
})(jQuery);
将它放在全局的某个地方,它将在jquery加载后运行,你应该全部设置。您的现有加载代码将不再缓存。
答案 10 :(得分:0)
试试这个:
$("#Search_Result").load("AJAX-Search.aspx?q=" + $("#q").val() + "&rnd=" + String((new Date()).getTime()).replace(/\D/gi, ''));
使用它时效果很好。
答案 11 :(得分:0)
我注意到如果某些服务器(如Apache2)未配置为专门允许或拒绝任何“缓存”,那么即使您将HTTP标头设置为“no-”,服务器也可以默认发送“缓存”响应缓存”。因此,请确保您的服务器在发出响应之前没有“缓存”任何内容:
对于Apache2,你必须
1)编辑“disk_cache.conf”文件 - 禁用缓存添加“CacheDisable / local_files”指令
2)加载mod_cache模块(在Ubuntu上“sudo a2enmod cache”和“sudo a2enmod disk_cache”)
3)重启Apache2(Ubuntu“sudo service apache2 restart”);
这应该可以解决服务器端禁用缓存的问题。 干杯! :)
答案 12 :(得分:0)
此代码可以帮助您
var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));
答案 13 :(得分:0)
如果您想坚持使用Jquery的.load()方法,请添加URL的唯一内容,例如JavaScript时间戳。 &#34; + new Date()。getTime()&#34;。注意我必须添加&#34;&amp; time =&#34;所以它不会改变你的pid变量。
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());
});