Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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不在google chrome上缓存_Javascript_Google Maps Api 3_Browser Cache_Dynamic Loading - Fatal编程技术网

强制动态加载的javascript不在google chrome上缓存

强制动态加载的javascript不在google chrome上缓存,javascript,google-maps-api-3,browser-cache,dynamic-loading,Javascript,Google Maps Api 3,Browser Cache,Dynamic Loading,我正在使用GoogleMaps加载程序(使用GoogleMapsJavaScriptAPI)。我想在路径可用时动态地向路径添加点编辑:网页和javascript在本地存储和加载,而不是通过web服务器 为此,我创建了一个外部javascript文件,在其中放置了我想要使用的数据 我使用stackoverflow上其他地方的一个很好的技巧加载java脚本对象: function loadjsfile( filename, callback ) { var fileref = documen

我正在使用GoogleMaps加载程序(使用GoogleMapsJavaScriptAPI)。我想在路径可用时动态地向路径添加点编辑:网页和javascript在本地存储和加载,而不是通过web服务器

为此,我创建了一个外部javascript文件,在其中放置了我想要使用的数据

我使用stackoverflow上其他地方的一个很好的技巧加载java脚本对象:

function loadjsfile( filename, callback )
{
    var fileref = document.createElement( 'script' );
    fileref.setAttribute( "type", "text/javascript" );
    fileref.setAttribute( "src", filename );

    var done = false;
    fileref.onload  = fileref.onreadystatechange    = function()
    {
        if( !done && ( !this.readyState 
                                || this.readyState == "loaded" 
                                || this.readyState == "complete") )
        {
                done = true;

                // Continue your code
                callback();

                // Handle memory leak in IE
                fileref.onload = fileref.onreadystatechange = null;
                document.getElementsByTagName( "script" )[0].removeChild( fileref );
        }   
    };
    document.getElementsByTagName( "script" )[0].appendChild( fileref );
}
这非常有效,因为它会等待外部javascript实际加载后再继续初始化

这一切都很好,它装载得很好。然后我设置了一个5秒的超时,重新加载外部javascript文件。这就是我的问题所在。Google chrome正在从缓存中重新加载外部javascript文件,而不是直接进入磁盘。这是一个巨大的痛苦,因为这意味着我的地图路径不会随着时间的推移而更新。我真的需要它

当我刷新整个页面时,很好,它重新加载了javascript,但闪烁非常恼人(它迫使地图回到“初始”状态)。如果我每次都能强迫它重新加载javascript文件,那么这个新方法将非常有效

有人能帮我吗

<>我对JavaScript非常新(我主要是C++程序员),所以如果我问一些愚蠢的问题,请道歉:D/P > < P>你可以(如果你的文件是在Apache WebServer上托管的),将A.HTAccess文件添加到目录,包含你的脚本文件,内容是:

Header set Cache-Control "no-cache"
这将阻止缓存文件


还有其他方法可以发送这些标题信息。

如果没有其他人有其他想法,请尝试在文件名中添加一个随机数作为查询字符串。这将告诉脚本文件是新的,应该强制重新加载

基本上每次生成一个随机数。

var rnd = Math.floor(Math.random()*80000);
所以您的代码看起来像

function loadjsfile( filename, callback )
{
    var rnd = Math.floor(Math.random()*80000);
    var fileref = document.createElement( 'script' );
    fileref.setAttribute( "type", "text/javascript" );
    fileref.setAttribute( "src", filename + "?r=" + rnd ); // note this line

    // other code...
}

对不起,我应该说明这是从当地商店完成的。我已经更新了我的问题。如果你正在使用谷歌浏览器进行本地开发,那么在开发过程中禁用缓存。为此,请打开开发工具(ctrl+shift+i)并单击右下角的设置中心距。“常规”选项卡。禁用缓存。这似乎很有效。你能解释一下为什么会这样吗?如果我理解正确的话,它会向javascript发送一个查询,但我不明白为什么会强制重新加载。因为浏览器认为它是一个不同的文件,即由于URL的变化而动态生成的页面。我不确定浏览器是否会尝试缓存每一个随机url,但可能值得用一个较小的示例进行测试。好的,我想我明白了。作为发送到浏览器的查询,浏览器不知道服务器将返回什么。因此,它不可能使用缓存版本,因为查询可能返回完全不同的内容。但是,查询字符串只是被忽略,因为web浏览器不知道我没有做这么复杂的事情。是吗?@Goz,是的,你找到了:)一个查询字符串可能会产生不同的内容,因此浏览器不会缓存它。不要忘记,如果你担心两次命中同一个数字,你也可以通过增加乘数来增加随机大小:)讨厌挑剔,但是使用随机数仍然有机会(不管它有多小)提供缓存版本。新建日期().getTime()可能更好。