2

我正在开发一个谷歌地图加载器(使用谷歌地图 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

4

2 回答 2

2

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

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

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...
}
于 2010-11-09T10:30:32.570 回答
1

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

Header set Cache-Control "no-cache"

这将防止文件被缓存。

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

于 2010-11-09T10:29:39.030 回答