Javascript 加载外部文件变量,同时避免浏览器外部文件缓存

Javascript 加载外部文件变量,同时避免浏览器外部文件缓存,javascript,scope,Javascript,Scope,我需要将时间戳附加到标记url中的javaScript文件,以避免缓存 stackoverflow中的这个函数似乎可以做到这一点: <script type="text/javascript"> (function(){ var randomh=Math.random(); var e = document.getElementsByTagName("script")[0]; var d = document.createElement("script"); d.src =

我需要将时间戳附加到标记url中的javaScript文件,以避免缓存

stackoverflow中的这个函数似乎可以做到这一点:

<script type="text/javascript">
(function(){ 
 var randomh=Math.random();
 var e = document.getElementsByTagName("script")[0];
 var d = document.createElement("script");
 d.src = "TESTINGX.JS?x="+randomh+"";
 d.type = "text/javascript"; 
 d.async = true;
 d.defer = true;
 e.parentNode.insertBefore(d,e);
由于某种原因,变量没有得到全局范围(或者问题是其他的)

我的html如下所示:

<!DOCTYPE html>
<HTML><HEAD>

<script type="text/javascript">
(function(){ 
     var randomh=Math.random();
     var e = document.getElementsByTagName("script")[0];
     var d = document.createElement("script");
     d.src = "TESTINGX.JS?x="+randomh+"";
     d.type = "text/javascript"; 
     d.async = true;
     d.defer = true;
     e.parentNode.insertBefore(d,e);
 })();
</script>

</HEAD><BODY>

<h1>WiFi Mini Web Server</h1>

<script>
document.write(hello); //hello var is contained in the TESTINGX.JS file\n\
</script>
</BODY></HTML>

(函数(){
var randomh=Math.random();
var e=document.getElementsByTagName(“脚本”)[0];
var d=document.createElement(“脚本”);
d、 src=“TESTINGX.JS?x=“+randomh+”;
d、 type=“text/javascript”;
d、 异步=真;
d、 延迟=真;
e、 parentNode.insertBefore(d,e);
})();
WiFi迷你网络服务器
document.write(你好)//hello var包含在TESTINGX.JS文件中\n\
试试这个

    <script type="text/javascript">
(function(){ 
     var randomh=Math.random();
     var e = document.getElementsByTagName("script")[0];
     var d = document.createElement("script");
     d.src = "TESTINGX.JS?x="+randomh+"";
     d.type = "text/javascript"; 
     d.async = true;
     d.defer = true;
     e.parentNode.insertBefore(d,e);
document.write(hello);
 })();
</script>

(函数(){
var randomh=Math.random();
var e=document.getElementsByTagName(“脚本”)[0];
var d=document.createElement(“脚本”);
d、 src=“TESTINGX.JS?x=“+randomh+”;
d、 type=“text/javascript”;
d、 异步=真;
d、 延迟=真;
e、 parentNode.insertBefore(d,e);
document.write(你好);
})();
试试这个

    <script type="text/javascript">
(function(){ 
     var randomh=Math.random();
     var e = document.getElementsByTagName("script")[0];
     var d = document.createElement("script");
     d.src = "TESTINGX.JS?x="+randomh+"";
     d.type = "text/javascript"; 
     d.async = true;
     d.defer = true;
     e.parentNode.insertBefore(d,e);
document.write(hello);
 })();
</script>

(函数(){
var randomh=Math.random();
var e=document.getElementsByTagName(“脚本”)[0];
var d=document.createElement(“脚本”);
d、 src=“TESTINGX.JS?x=“+randomh+”;
d、 type=“text/javascript”;
d、 异步=真;
d、 延迟=真;
e、 parentNode.insertBefore(d,e);
document.write(你好);
})();

为缓存破坏编写代码时,还要确保以“惰性”、“非阻塞”的方式加载脚本。这意味着加载DOM后将加载
TESTING.js
。这也意味着
document.write
脚本在加载js文件之前运行,并将所需的变量添加到全局范围

有几种解决方案: 1.从加载脚本中删除
defer
async

  • 确保只有在实际加载脚本后,才能在页面上访问脚本中的变量

  • 更好的是,不要试图通过聪明的javascript处理缓存破坏(我假设html问题是使用某种服务器技术(如jsp或php脚本)解决的)。使用服务器技术将带有随机数或时间戳的参数添加到html中常用的脚本标记中

  • 不要使用脚本来破坏缓存,而是使用普通脚本标记,其参数与构建当天的时间戳(以毫秒为单位)相同,并嵌入到微控制器/服务器中。将其视为js文件的版本号。因此,只要版本号是最新的,客户端就可以使用浏览器中缓存的文件

  • 这个ant任务是实现第4点的好方法。我在这方面有很好的经验


    希望这能有所帮助。

    您编写的缓存破坏代码,也恰好确保了脚本以“惰性”、“非阻塞”的方式加载。这意味着加载DOM后将加载
    TESTING.js
    。这也意味着
    document.write
    脚本在加载js文件之前运行,并将所需的变量添加到全局范围

    有几种解决方案: 1.从加载脚本中删除
    defer
    async

  • 确保只有在实际加载脚本后,才能在页面上访问脚本中的变量

  • 更好的是,不要试图通过聪明的javascript处理缓存破坏(我假设html问题是使用某种服务器技术(如jsp或php脚本)解决的)。使用服务器技术将带有随机数或时间戳的参数添加到html中常用的脚本标记中

  • 不要使用脚本来破坏缓存,而是使用普通脚本标记,其参数与构建当天的时间戳(以毫秒为单位)相同,并嵌入到微控制器/服务器中。将其视为js文件的版本号。因此,只要版本号是最新的,客户端就可以使用浏览器中缓存的文件

  • 这个ant任务是实现第4点的好方法。我在这方面有很好的经验


    希望这有帮助。

    如果您希望外部脚本在加载之前阻止所有其他内容,但仍然需要从动态URL加载它(听起来像这样),您应该能够
    文档。直接编写脚本元素,而不是使用DOM方法

    <!DOCTYPE html>
    <html><head>
    
    <script>
    var randomh = Math.random();
    document.write('<script src="TESTINGX.JS?x=' + randomh + '"></' + 'script>');
    </script>
    
    </head><body>
    
    <h1>WiFi Mini Web Server</h1>
    
    <script>
    document.write(hello); // hello var is contained in the TESTINGX.JS file
    </script>
    
    </body></html>
    
    
    var randomh=Math.random();
    文件。写(“”);
    WiFi迷你网络服务器
    document.write(你好);//hello var包含在TESTINGX.JS文件中
    

    如果您希望外部脚本在加载之前阻止所有其他内容,但仍然需要从动态URL加载它(听起来像这样),那么您应该能够
    文档。直接编写脚本元素,而不是使用DOM方法

    <!DOCTYPE html>
    <html><head>
    
    <script>
    var randomh = Math.random();
    document.write('<script src="TESTINGX.JS?x=' + randomh + '"></' + 'script>');
    </script>
    
    </head><body>
    
    <h1>WiFi Mini Web Server</h1>
    
    <script>
    document.write(hello); // hello var is contained in the TESTINGX.JS file
    </script>
    
    </body></html>
    
    
    var randomh=Math.random();
    文件。写(“”);
    WiFi迷你网络服务器
    document.write(你好);//hello var包含在TESTINGX.JS文件中
    

    也许你的意思是var hello=“hello World!”;是的,我是这样写的,我只是在问问题时犯了一个打字错误;正在加载文件之前调用。您的意思可能是var hello=“hello World!”;是的,我是这样写的,我只是在问问题时犯了一个打字错误;是否在加载文件之前调用,以及是否删除var关键字?关闭
    var
    应该会使变量本身具有全局性。我尝试过,但没有起作用,所以现在我认为问题可能与psr下面评论的内容有关,或者这两个问题结合在一起。现在我测试了psr的代码,删除了单词var,但仍然相同,如果删除了var关键字?关闭
    var
    应该会使变量本身具有全局性。我尝试过,但没有成功,所以现在我认为问题可能与此相关