我最近一直在学习JavaScript,并且我看过许多使用Math.rand()附加到链接的示例(Facebook.com,Readability bookmarklet)。
这解决了什么问题?可读性书签的示例参数:
_readability_script.src='http://lab.arc90.com/....script.js?x='+(Math.random());
在JavaScript中是否存在碰撞或其他问题?
答案 0 :(得分:15)
正如鲁本斯所说,这通常是一种防止缓存的技巧。浏览器通常会非常积极地缓存JavaScript和CSS,这可以节省带宽,但在更改脚本时也会导致部署问题。
我们的想法是浏览器会将http://www.example.com/something.js?foo
上的资源视为与http://www.example.com/something.js?bar
不同,因此不会使用其本地缓存来检索资源。
可能更常见的模式是附加递增值,只要资源需要更改,就可以更改该值。通过这种方式,您可以通过客户端缓存提供重复请求获益,但在部署新版本时,您可以强制浏览器获取新版本。
就个人而言,我喜欢将文件的最后修改时间作为Unix时间戳附加,因此每当我更改文件时,我都不必去打猎并碰撞版本号。
答案 1 :(得分:4)
重点是避免浏览器缓存这些资源。
答案 2 :(得分:1)
这将确保脚本是唯一的,并且不会作为静态资源缓存,因为查询字符串每次都会更改。
答案 3 :(得分:1)
这是因为Internet Explorer喜欢缓存所有内容,包括通过JavaScript代码发出的请求。
另一种在URL中没有随机数的方法是将Cache-Control标头添加到包含您不想缓存的项目的目录中:
# .htaccess
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
大多数浏览器都尊重Cache-Control,但IE(包括7,未测试8)只承认Pragma标头。
答案 4 :(得分:0)
根据浏览器选择如何解释资源的缓存提示,如果您只是要求浏览器将网址更改为之前使用过的网址,则可能无法获得所需的效果。 (大多数鼠标悬停图像按钮依赖于浏览器将重用缓存资源以提高速度的事实)
当您想确保浏览器获得资源的新副本(如动态股票代码图像等)时,您强制浏览器始终认为内容是新的,可以附加日期/时间或每个 - 数字或随机的gargabe)。
答案 5 :(得分:0)
有一个名为squid的工具可以缓存网页。使用随机数将保证请求不会像这样的中间人。即使Header设置了Cache-Control“no-cache”,你仍然可能需要添加一个随机数来获得像“squid”这样的东西。