我需要将时间戳附加到标记网址中的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>
答案 0 :(得分:2)
您为缓存清除编码,也恰好确保以“懒惰”,“非阻塞”方式加载脚本。这意味着在加载DOM之后加载了TESTING.js
。这也意味着在加载js文件之前运行document.write
脚本,并将所需的var添加到全局范围。
可以有几种解决方案:
1.从加载脚本中删除defer
和async
确保只有在实际加载脚本后才能在您的页面上访问脚本中的变量
更好的是,不要尝试通过聪明的javascript处理缓存清除(我假设html是使用某种服务器技术,如jsp或php脚本提供的问题)。使用服务器技术将带有随机数或时间戳的参数添加到html中的常用脚本标记
使用普通脚本标记,使用普通脚本标记,使用与millis中的时间戳相同的参数,与进行构建的那天相同,并嵌入到微控制器/服务器中。将其视为js文件的版本号。因此,如果版本号是最新的,客户端可以使用在其浏览器中缓存的文件。
这个蚂蚁任务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>
答案 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>