加载外部<;脚本>;没有使用Javascript的缓存

加载外部<;脚本>;没有使用Javascript的缓存,javascript,jquery,Javascript,Jquery,我想将一个外部javascript文件加载到页面中,并确保它没有被缓存。我没有访问php的权限,因此无法在文件名后生成随机字符串 在PHP中,脚本如下所示: <script src="http://site.com/cool.js?<?php echo $randomnumber; ?>"></script> 只需向脚本的src添加一个随机字符串,就像使用PHP一样。为此,您需要使用JS注入标记 var s = document.createElement(

我想将一个外部javascript文件加载到页面中,并确保它没有被缓存。我没有访问php的权限,因此无法在文件名后生成随机字符串

在PHP中,脚本如下所示:

<script src="http://site.com/cool.js?<?php echo $randomnumber; ?>"></script>

只需向脚本的
src
添加一个随机字符串,就像使用PHP一样。为此,您需要使用JS注入
标记

var s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'path/to/file?' + new Date().getMilliseconds();

document.getElementsByTagName('head')[0].appendChild(s);
使用jQuery而不是脚本标记

$.getScript("http://example.com/cool.js");
还是纯JavaScript

var scr = document.createElement("script");
scr.src = "http://example.com/cool.js" + "?ts=" + new Date().getTime();
document.getElementsByTagName("head")[0].appendChild(scr);

当然,只需在DOM中插入一个脚本标记,由JS生成值,例如

var d = new Date.getTime();
$('head').append('<scri' + 'pt src="http://....?cachebuster=' + d + '"></scr' + 'ipt>');
var d=new Date.getTime();
$('head')。追加('');

您可以试试
。还有一个问题是这样的:

您可以将服务器配置为设置适当的头。无法从浏览器端执行此操作。脚本标记是否已存在?或者您正在使用javascript添加一个新的脚本标记。使用jQuery的$.getScript并在文件名的末尾添加一个随机字符串-@JayBlanchard ah-我将“我没有访问php的权限”解释为“我没有访问源代码的权限”;如果页面代码可以更改,则“是”可以正常工作。@JayBlanchard getScript已经这样做了。在docs:Be default中,$.getScript()将缓存设置设置为false。这会在请求URL中附加一个带时间戳的查询参数,以确保每次请求脚本时浏览器都会下载该脚本。如果运气好的话,fyi:getmillizes()可以重复。在某种程度上,这是一个有效点,但由于在同一上下文(浏览器、时间等)中没有多次重复此操作,因此机会非常低.生日悖论说,只要有32个请求,就有50%的几率重复一个值。请求不经常发出这一事实意味着,如果重复的值与缓存的版本匹配,则更可能是脚本的旧版本,而不是最新版本。最好使用较长的字符串,如只能在很短的时间内重复的
getTime()
getmillizes()
以这种方式使用时,实际上只是一个非常低熵的随机数。您完全正确,因为这种确切的方式并不能保证良好的唯一性。(因此,如果附加的随机值恰好与以前的值相同,则可能最终会收到脚本的缓存副本。)我的目标不是提供足够的唯一性。但无论如何,这里有一个更好的随机添加到请求URL:
parseInt(Math.random().toString().substr(-5))
@marekful为什么不在同一浏览器会话中重复此操作1000次?如果我的服务器定期提供实时更新,那么只需几分钟就可以达到1000次。我想这是整个页面的更新。不是一个JavaScript资源。太棒了!!!我把头撞在墙上,想弄明白如何让Edge停止缓存。所有反缓存HTTP头均未工作。“?ts=”太棒了!!非常感谢你。