设为首页 收藏本站
查看: 813|回复: 0

[经验分享] js获取Last-Modified Header的问题(document.lastModified)

[复制链接]

尚未签到

发表于 2017-2-23 12:19:56 | 显示全部楼层 |阅读模式
  这里不是关于像nodejs那样的服务端js,运行在页面中的js想直接获取http流中的Header是很困难的,出于安全的考虑也是不被允许的,
  庆幸的是:还好各大浏览器都已经提供了对Last-Modified的支持,好像这是提供的唯一的Header,用js通过document.lastModified就能直接访问到。
  悲剧的是:各大浏览器对读取这一Header的支持没有一个统一的规范,兼容性实在不敢恭维。
  差异1
  在服务端有发送 Last-Modified Header 的情况下,也就是Http流中包含有该Header时,不同浏览器的时间格式不一致,有UTC时间和LocalTimeZone之分:
  UTC:IE,Firefox,Opera
LocalTimeZone:Chrome,Safari
  差异2
  当Http流中没有该Header时,我的第一反应是觉得应该返回null,可惜事与愿违,不同的浏览器返回的东西也有差别,有返回时间初始值和返回当前时间之分:
  初始值:Opera
  当前时间:Firefox、IE、Chrome、Safari
  为了使用上的方便,需要包装掉这些差异,针对各个主要的浏览器实现一个统一的行为。
  解决差异1,
  可以通过改变Chrome、Safari的时间时区来解决。
  解决差异2,
  只要跟当前时间对比就可以了?。。。等等不是的,脚本被执行的时间是在页面完成载入的时间之后的,而这个时间差也是很难得到一个确切的值,因为假如判断的脚本是放在脚本文件的话,还要算上页面载入该脚本文件的网络请求的时间开销,就算是硬编码在页面的script标签内,理论也是有一个比较短暂的时间差的,所以这个时间差要自己拿捏好,我的代码中以30秒为时间差,个人觉得这在实际使用中完全可以,这是假设最坏的情况下该脚本在30秒内被执行,而在这30秒内的真实的Last-Modified会被忽略返回null,对一个正常运行的站点来说是不会出现30秒内的Last-Modified的资源的。
  以下是代码:



    /*
* browser
*/
var ua = navigator.userAgent.toLowerCase(), check = function (r) { return r.test(ua); }, isOpera, isSafari;
var browser = {
chrome: check(/\bchrome\b/),
opera: (isOpera = check(/opera/)),
safari: (isSafari = check(/webkit/)),
gecko: !isSafari && check(/gecko/),
msie: !isOpera && check(/msie/)
};


    /*
* fix the 'lastModified' difference between major browsers
*/
var lastModified = function (defer) {
// when server does not send Last-Modified Header opera provide a minimum datetime value.
var time = new Date(document.lastModified);
if (time.getTime() === 0) { return null; }
// assume that this script will be executed in 30 seconds after the clien page loaded.
var now = new Date(), deferTicks = (defer || 30) * 1000;
if (browser.chrome || browser.safari) {
// chrome and safari use a LocalTime type
var offset = -now.getTimezoneOffset(); // unit of minute
time = new Date(time.getTime() + (offset * 60 * 1000));
}
if (now - time < deferTicks) { return null; }
// ret
return time.getTime();
} ();
  参考文档:
  https://developer.mozilla.org/en/DOM/document.lastModified

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346245-1-1.html 上篇帖子: 【原】Node.JS环境搭建手顺(无脑操作) 下篇帖子: 博客园上海地区活动 — LinkCoder主题社区第三期:HTML5的方方面面
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表