2013-04-20 75 views
0

我需要将时间戳添加到标记url中的javaScript文件以避免缓存。加载外部文件变量,同时避免浏览器外部文件缓存

发现这里计算器该功能似乎做它:

<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); 

})();

但问题是,文件testingx.js里面我已经放在下面的代码:

var hello = "Hello World!"; 

出于某种原因,该变量并没有得到全球范围内(或可能的问题是其他)。

我的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> 
+0

,如果你删除var关键字?离开'var'应该使变量具有固有的全局性。 – Jared 2013-04-20 17:16:49

+0

我试过了,并没有工作,所以现在我的问题可能与psr评论下面或两个问题相结合。 – electronixG 2013-04-20 17:23:27

+0

现在我测试了PSR的代码并删除了var这个词,但仍然是相同的 – electronixG 2013-04-20 17:27:24

回答

2

如果您希望外部脚本在加载之前阻止其他所有内容,但仍需要从动态URL加载它(听起来像您一样),您应该能够直接使用脚本元素document.write而不是使用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> 

http://jsbin.com/ixagud/2/edit

+0

听起来不错,简单的解决方案 – electronixG 2013-04-20 18:13:37

+0

是的,它的确在我的嵌入式设备上工作,真的很简单,我绝对不知道多少javaScript – electronixG 2013-04-20 18:15:59

+0

非常感谢你和所有其他人慷慨地试图帮助我 – electronixG 2013-04-20 18:16:42

1

试试这个

<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> 
+0

也许你的意思是var hello =“Hello World!”;是的,我有这样的问题,当我问这个问题时,我只是犯了一个打字错误。 – electronixG 2013-04-20 17:07:47

+0

here document.write(hello);在加载文件之前调用 – PSR 2013-04-20 17:08:37

+0

我该如何解决它? – electronixG 2013-04-20 17:11:11

2

您代码清除缓存,也恰好确保脚本是在一个“懒”装,“非阻塞“的态度。这意味着TESTING.js已加载您的DOM已加载。这也意味着document.write脚本在js文件加载之前运行,并将所需的var添加到全局范围。

可以有几种解决方案:从您的加载脚本 1.拆下deferasync

  1. 确保你的脚本变量是你的页面上访问,只有在脚本实际加载

  2. 更好的是,不要试图通过聪明的JavaScript处理缓存破坏(我假设html是问题是使用某种服务器技术,如jsp或php脚本)。使用服务器技术将一个带有随机数或时间戳的参数添加到html中的常用脚本标记中使用正常脚本标记代替使用脚本来标记缓存,而参数与毫秒中的时间戳,以及构建时的日期,并嵌入到微控制器/服务器中。把它看作是js文件的版本号。所以客户可以使用缓存在浏览器中的文件,只要版本号是最新的。

此Ant任务http://code.google.com/p/ant-web-tasks/wiki/CacheBusting是实现点没有4.我有很好的经验与它的好办法。

希望这会有所帮助。

+0

我也测试过从我的加载脚本中删除延迟和异步仍然不起作用。 – electronixG 2013-04-20 17:35:21

+0

我不能使用服务器端代码,因为我的网页是嵌入到微控制器(一个小型​​计算机芯片形状),所以我只能依靠客户端编码。 – electronixG 2013-04-20 17:36:37

+0

如何才能确保我的脚本中的变量仅在脚本实际加载后才能在我的页面上访问? – electronixG 2013-04-20 17:37:38