Javascript Jquery getScript缓存
默认情况下,$.getScript()禁用缓存,您可以使用$.ajaxSetup并将缓存设置为true。当测试脚本是否真的被Firebug缓存时,大多数时候脚本返回到200(这意味着脚本是一个新的副本),而20或30次中有一次它将返回304(意味着它使用了缓存版本)。为什么它在绝大多数情况下都会得到一份新的拷贝Javascript Jquery getScript缓存,javascript,jquery,getscript,Javascript,Jquery,Getscript,默认情况下,$.getScript()禁用缓存,您可以使用$.ajaxSetup并将缓存设置为true。当测试脚本是否真的被Firebug缓存时,大多数时候脚本返回到200(这意味着脚本是一个新的副本),而20或30次中有一次它将返回304(意味着它使用了缓存版本)。为什么它在绝大多数情况下都会得到一份新的拷贝 $.ajaxSetup({ cache: true }); $.getScript( scriptFile ); getScript检索的文件尚未编辑,请求之间存在页面更
$.ajaxSetup({
cache: true
});
$.getScript( scriptFile );
getScript检索的文件尚未编辑,请求之间存在页面更改。首先让我们澄清jQuery禁用缓存的含义 当jQuery禁用缓存时is意味着通过某种技巧,例如在url末尾添加一个额外的随机数作为参数,强制浏览器重新加载文件 当jQuery启用缓存时,不强制任何内容,并让您在该文件的头上设置的缓存。这意味着,如果您没有在文件头上设置参数以将其保留在浏览器缓存中,浏览器将尝试通过某些方法再次加载它 因此,使用Enablethecachebyjquery,您必须已经在静态文件上设置了正确的缓存头,以便保留在浏览器缓存中,否则浏览器可能会再次尝试加载它们 对于浏览器在标题上看到创建日期的文件,则连接到服务器,再次询问标题,比较标题,如果没有更改,则不会再次加载,而是向服务器进行一次调用 对于您已设置了最长保存时间的文件,并且在该日期之前不会询问服务器,则浏览器会直接从缓存中加载该文件(如果他找到) 总结一下:
cache:true
由浏览器根据您发送的头决定此文件的缓存。缓存:false
将强制重新加载文件
一些与缓存相关的问题:t内部代码
getScript()
正在调用jQuery.get()
开关
因此,通过调用getScript()
您可以进行一个ajax调用,而jQuery没有保留任何类型的文件缓存(如果您一开始这么认为的话)
用于加载SRIPT的自定义功能如果您不想创建全局缓存:true,并且只需要使用cache:true加载一些文件,则可以将自定义函数设置为:
function getScriptCcd(url, callback)
{
jQuery.ajax({
type: "GET",
url: url,
success: callback,
dataType: "script",
cache: true
});
};
这不受全局缓存参数的影响,加载脚本文件时不会在最后添加任何非缓存参数。我知道这是一篇老文章,现有答案是真实答案,但说到Iscariot的担心,它实际上是缓存(至少有点类似)。这只是firefox的一个怪癖。也许这会对其他被这种怪癖弄糊涂的人有用 我用一个非常大的javascript文件测试了这个概念,该文件基于数万个Latlon的数组定义了爱达荷州DOT地区边界的google map多边形(未压缩的文件大小为2806257,但我通过压缩过程运行)。使用以下javascript
// Grab polys if not already loaded
if (typeof(defaults.data.polys) === 'undefined') {
/*$.getScript('/Scripts/ScriptMaster.php?file=Districts', function () {});*/
$.ajax({
type: "GET",
url: '/Scripts/ScriptMaster.php?file=Districts',
success: function() {
defaults.data.polys = getPolys();
data.polys = defaults.data.polys;
},
dataType: "script",
cache: true
});
}
您可以看到相关的php(您不需要实际的Districts.js文件,这篇文章会占用太多空间,所以这里是ScriptMaster.php)
如您所见,我的localhost服务器到web客户端的连接不是最一致的,我的笔记本电脑规格有点破旧(单核处理器和所有的,它也有几年的历史了),但关键是在加载缓存后,加载时间有了显著的下降
[此外,如果有人对没有压缩脚本感到好奇(不像标签、空格或新行被浪费,它必须仍然可读),加载大约需要7-8秒,但我不会重复5次]
所以,不要害怕,这真的很重要。老实说,对于只需要ms加载的较小脚本,您可能不会注意到firefox中的差异;只是因为它检查来自服务器的头。我之所以知道这一点,是因为从脚本末尾到开始移动这些头函数时,加载时间发生了变化。如果在php遍历字符串之后有这些函数,则加载所需的时间更长
希望这有帮助 在发布此问题的日期,Firefox和Chrome都会声明脚本没有从缓存加载,而实际上是从缓存加载的,这是一个错误。截至本答复之日,该问题仍然存在。最简单的测试方法是使用console.log并发送版本号 要缓存动态加载的脚本,只需使用以下代码即可
function onDemandScript ( url, callback ) {
callback = (typeof callback != 'undefined') ? callback : {};
$.ajax({
type: "GET",
url: url,
success: callback,
dataType: "script",
cache: true
});
}
对于开发,您应该注释掉cache:true
默认情况下,$.getScript()将缓存设置设置为false。这将向请求URL追加一个带时间戳的查询参数,以确保浏览器在每次请求脚本时都下载该脚本
jQuery文档站点有一个很好的扩展,用于不向请求添加时间戳并绕过缓存:
jQuery.cachedScript = function( url, options ) {
// Allow user to set any option except for dataType, cache, and url
options = $.extend( options || {}, {
dataType: "script",
cache: true,
url: url
});
// Use $.ajax() since it is more flexible than $.getScript
// Return the jqXHR object so we can chain callbacks
return jQuery.ajax( options );
};
// Usage
$.cachedScript( "ajax/test.js" ).done(function( script, textStatus ) {
console.log( textStatus );
});
实际上,有一个更好的选项,您可以为某些请求打开缓存,例如:
$.ajaxPrefilter(function( options ) {
if ( options.type==='GET' && options.dataType ==='script' ) {
options.cache=true;
}
});
您可能正在寻找的是一个
getScriptOnce
函数,如果它知道文件已成功加载,则在调用该函数时基本上不会再次加载该文件
我写了这样的函数。您可以使用Firebug或Chrome开发工具中的网络选项卡进行测试。这只是加载同一个文件一次。您只需将getScriptOnce
函数和全局数组ScriptArray
var getScriptOnce=(函数(url,回调){
var scriptArray=[];//URL数组
返回函数(url、回调){
//数组没有这样的url
if(scriptArray.indexOf(url)=-1){
if(回调类型==='function'){
return$.getScri
function onDemandScript ( url, callback ) {
callback = (typeof callback != 'undefined') ? callback : {};
$.ajax({
type: "GET",
url: url,
success: callback,
dataType: "script",
cache: true
});
}
jQuery.cachedScript = function( url, options ) {
// Allow user to set any option except for dataType, cache, and url
options = $.extend( options || {}, {
dataType: "script",
cache: true,
url: url
});
// Use $.ajax() since it is more flexible than $.getScript
// Return the jqXHR object so we can chain callbacks
return jQuery.ajax( options );
};
// Usage
$.cachedScript( "ajax/test.js" ).done(function( script, textStatus ) {
console.log( textStatus );
});
$.ajaxPrefilter(function( options ) {
if ( options.type==='GET' && options.dataType ==='script' ) {
options.cache=true;
}
});