停止jQuery。从缓存中加载响应
我有以下代码对URL发出GET请求:停止jQuery。从缓存中加载响应,jquery,ajax,caching,Jquery,Ajax,Caching,我有以下代码对URL发出GET请求: $('#searchButton').click(function() { $('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()); }); 但返回的结果并不总是反映出来。例如,我在响应中做了一个更改,抛出了堆栈跟踪,但当我单击搜索按钮时,堆栈跟踪没有出现。我查看了控制ajax响应的底层PHP代码,它有正确的代码,访问页面直接显示
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val());
});
但返回的结果并不总是反映出来。例如,我在响应中做了一个更改,抛出了堆栈跟踪,但当我单击搜索按钮时,堆栈跟踪没有出现。我查看了控制ajax响应的底层PHP代码,它有正确的代码,访问页面直接显示了正确的结果,但是.load返回的输出是旧的
如果我关闭浏览器并重新打开它,它会工作一次,然后开始返回过时的信息。我可以通过jQuery来控制这一点,还是需要使用PHP脚本输出标题来控制缓存?一种方法是在url的末尾添加一个唯一的数字:
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());
编写uniqueId()以在每次调用时返回不同的内容。这在IE中特别麻烦。基本上,您必须将“无缓存”HTTP头与服务器的响应一起发送回。如果您希望按请求控制缓存,则必须使用更复杂的函数,如
$.ajax()
。或者,如果您只是想在所有情况下都将其关闭,请将以下内容放在脚本的顶部:
$.ajaxSetup ({
// Disable caching of AJAX responses
cache: false
});
对于PHP,将这一行添加到脚本中,以提供所需的信息:
header("cache-control: no-cache");
或者,向查询字符串添加唯一变量:
"/portal/?f=searchBilling&x=" + (new Date()).getTime()
试试这个:
$("#Search_Result").load("AJAX-Search.aspx?q=" + $("#q").val() + "&rnd=" + String((new Date()).getTime()).replace(/\D/gi, ''));
当我使用它时,它工作得很好。下面是一个如何根据每个请求控制缓存的示例
$.ajax({
url: "/YourController",
cache: false,
dataType: "html",
success: function(data) {
$("#content").html(data);
}
});
萨沙是个好主意,我用的是混音 我创建了一个函数
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");
例如js.LoadWithoutCache(actionUrl2,“div2”);
例如js.LoadWithoutCache(actionUrl3,“div3”);
}
},我注意到,如果某些服务器(如Apache2)未配置为专门允许或拒绝任何“缓存”,则服务器在默认情况下可能会发送“缓存”响应,即使您将HTTP头设置为“无缓存”。因此,请确保服务器在发出响应之前没有“缓存”任何内容: 就Apache2而言,您必须 1) 编辑“disk_cache.conf”文件-要禁用缓存,请添加“CacheDisable/local_files”指令 2) 加载mod_缓存模块(在Ubuntu“sudoa2enmod缓存”和“sudoa2enmod磁盘_缓存”上) 3) 重启Apache2(Ubuntu“sudo服务Apache2重启”) 这应该可以在服务器端禁用缓存。
干杯!:) 不要使用时间戳创建唯一的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=“” 另一种只在需要从服务器获取数据时才放下线的方法是将下线与ajax url一起追加 “?=”+Math.round(Math.random()*10000)此代码可能对您有所帮助
var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));
如果您想继续使用Jquery的.load()方法,请在URL中添加一些独特的内容,比如JavaScript时间戳。“+新日期().getTime()”。请注意,我必须添加一个“&time=”以便它不会改变pid变量
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());
});
您可以将jquery加载函数替换为缓存设置为false的版本
(函数($){
var_load=jQuery.fn.load;
$.fn.load=函数(url、参数、回调){
如果(url的类型!=“字符串”&&&&U加载){
返回_load.apply(这是参数);
}
变量选择器、类型、响应、,
self=这个,
off=url.indexOf(“”);
如果(关闭>-1){
选择器=stripeandcollapse(url.slice(off));
url=url.slice(0,关闭);
}
//如果它是一个函数
if(jQuery.isFunction(params)){
//我们假设是回调
回调=参数;
参数=未定义;
//否则,构建一个参数字符串
}else if(参数和类型参数==“对象”){
type=“POST”;
}
//如果我们有需要修改的元素,请提出请求
如果(自我长度>0){
jQuery.ajax({
url:url,
//如果“type”变量未定义,则将使用“GET”方法。
//使此字段的值显式,因为
//用户可以通过ajaxSetup方法覆盖它
类型:键入| |“获取”,
数据类型:“html”,
cache:false,
数据:params
}).done(函数(responseText){
//保存响应以在完整回调中使用
响应=参数;
html(选择器?
//如果指定了选择器,请在虚拟div中找到正确的元素
//排除脚本以避免IE“权限被拒绝”错误
jQuery(“”).append(jQuery.parseHTML(responseText)).find(选择器):
//否则使用完整结果
响应文本);
//如果请求成功,此函数将获取“数据”、“状态”、“jqXHR”
//但它们被忽略,因为响应设置在上面。
//如果失败,此函数将获得“jqXHR”、“status”、“error”
}).always(回调函数和函数(jqXHR,状态){
self.each(函数(){
apply(this,response | |[jqXHR.responseText,status,jqXHR]);
});
});
}
归还这个;
}
})(jQuery);
将它放在全局的某个地方,在jquery加载后它将运行,您应该已经做好了准备。您现有的加载代码将不再被缓存。谢谢!这甚至可以在jQuery文档中找到吗?啊。。。找到了。有点像浆果。这一天的大部分时间都是被踢屁股。。。再次感谢!所有这些cache:false都是在发出请求时在url的末尾附加一个数字(我相信这是一个时间戳)。ot
$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());
});