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

时间:2013-04-20 17:02:44

标签: javascript scope

我需要将时间戳附加到标记网址中的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);

})();

但问题是在testx.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>

3 个答案:

答案 0 :(得分:2)

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

可以有几种解决方案: 1.从加载脚本中删除deferasync

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

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

  3. 使用普通脚本标记,使用普通脚本标记,使用与millis中的时间戳相同的参数,与进行构建的那天相同,并嵌入到微控制器/服务器中。将其视为js文件的版本号。因此,如果版本号是最新的,客户端可以使用在其浏览器中缓存的文件。

  4. 这个蚂蚁任务http://code.google.com/p/ant-web-tasks/wiki/CacheBusting是实现第4点的好方法。我有很好的经验。

    希望这有帮助。

答案 1 :(得分: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

答案 2 :(得分: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>