【问题标题】:Forcing a dynamically loaded javascript to not cache on google chrome强制动态加载的 javascript 不在谷歌浏览器上缓存
【发布时间】:2010-11-09 10:25:02
【问题描述】:

我正在开发一个谷歌地图加载器(使用谷歌地图 JavaScript API)。我想在路径可用时动态添加点。 编辑网页和 javascript 在本地存储和加载,而不是通过网络服务器

为此,我创建了一个外部 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

【问题讨论】:

    标签: javascript google-maps-api-3 browser-cache dynamic-loading


    【解决方案1】:

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

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

    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...
    }
    

    【讨论】:

    • 甜蜜,似乎有效。你能解释一下为什么这行得通吗?如果我理解正确,它会向 javascript 发送查询,但我不明白为什么会强制重新加载。
    • 因为浏览器认为它是一个不同的文件,即由于 URL 的变化而动态生成的页面。我不确定浏览器是否会尝试缓存每个 random url,但可能值得用更小的样本进行测试。
    • 好的,我想我明白了。作为发送到浏览器的查询,浏览器不知道服务器究竟会返回什么。因此它不可能使用缓存版本,因为查询可能返回完全不同的东西。查询字符串只是被忽略了,因为网络浏览器不知道我没有做任何如此复杂的事情。对吗?
    • @Goz,是的,你知道了 :) 查询字符串 可能 产生不同的内容,因此浏览器不会缓存它。不要忘记,如果您担心两次击中相同的数字,也可以通过添加乘数来增加随机大小:)
    • 讨厌吹毛求疵,但使用随机数仍有机会(无论多么微小)仍然提供缓存版本。 new Date().getTime() 可能会更好。
    【解决方案2】:

    您可以(如果您的文件托管在 apache 网络服务器上)将 .htaccess 文件添加到目录中,其中包含您的脚本文件和内容:

    Header set Cache-Control "no-cache"
    

    这将防止文件被缓存。

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

    【讨论】:

    • 对不起,我应该说这是从本地商店完成的。我已经更新了我的问题。
    • 如果您使用 google chrome 进行本地开发,请在开发时禁用缓存。通过以下方式执行此操作:调出开发工具(ctrl + shift + i)单击右下角的设置齿轮。常规选项卡。禁用缓存。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2015-04-16
    • 2013-07-08
    • 2011-03-23
    相关资源
    最近更新 更多