Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jquery getScript缓存_Javascript_Jquery_Getscript - Fatal编程技术网

Javascript Jquery getScript缓存

Javascript Jquery getScript缓存,javascript,jquery,getscript,Javascript,Jquery,Getscript,默认情况下,$.getScript()禁用缓存,您可以使用$.ajaxSetup并将缓存设置为true。当测试脚本是否真的被Firebug缓存时,大多数时候脚本返回到200(这意味着脚本是一个新的副本),而20或30次中有一次它将返回304(意味着它使用了缓存版本)。为什么它在绝大多数情况下都会得到一份新的拷贝 $.ajaxSetup({ cache: true }); $.getScript( scriptFile ); getScript检索的文件尚未编辑,请求之间存在页面更

默认情况下,$.getScript()禁用缓存,您可以使用$.ajaxSetup并将缓存设置为true。当测试脚本是否真的被Firebug缓存时,大多数时候脚本返回到200(这意味着脚本是一个新的副本),而20或30次中有一次它将返回304(意味着它使用了缓存版本)。为什么它在绝大多数情况下都会得到一份新的拷贝

$.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;
  }
});