处理公共CDN突然失效的情况
公共CDN的使用
刚开始开发我的博客时,使用的bootcdn,发现他们被黑过,虽然想骂那些“黑客”,但是我们也没办法去防范,只能从自己的网站上入手解决。
那时我还没技术解决这个问题,网上搜过,大都只提问题不提解决。。。
如今尝试一番暂且解决了该问题。(一切建立在源站没被黑的前提下)
思考方案
浏览器加载js是顺序执行的,这里不提async和defer,只提onerror。
考虑以下HTML(chrome测试):
<head>
// ------ 方法1 -----
<script src="https://bootcdn.cn/jquery.min.js" onerror="this.src='mystatic/jquery.min.js'"></script>
// ------- END ------- // ------ 方法2 -----
<script>
function exchange(e, s){
let new_s = document.createElement('script');
new_s.src = s;
document.head.insertBefore(new_s, e);
e.remove();
}
</script>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js" onerror="exchange(this, 'mystatic/jquery.min.js')"></script>
// ------- END -------
</head>
<body>
<div id="main">something</div>
<script>
window.onload = ()=>{
$('#main').text('other thing');
}
</script>
</body>
- 方法一:萌新错误。浏览器仅请求bootcdn,失败后修改src,但js文件和img不同,浏览器不会下载`mystatic/jquery.min.js`而是继续向下执行,到`$`处报错。
- 方法二:浏览器请求bootcdn,失败后执行`exchange`函数创建一个新的`<script>`并替换bootcdn。观察到浏览器下载了`mystatic/jquery.min.js`,并且正确执行了onload函数,测试成功。
那么为什么不用第二种方法呢? ---- 下面说处理无刷新加载。
改进优化
1. onload问题
如果从无刷新加载下进入某个页面page.html,而且有一个page.js文件需要监听`window.onload`以执行操作。显然无刷新加载时,onload之前就已经触发了,JQuery的$(document).ready()可以解决此问题,这里用原生js解决。
function domready(callback) {
if (document.readyState === 'complete') {
callback();
} else {
let c = function () {
callback();
window.removeEventListener('load', c);
};
window.addEventListener('load', c);
}
}
加载js时检查readyState,如果DOM已加载完毕。那么不必监听onload,直接执行。反之正常监听。
2. js依赖问题
如果page.js的初始化需要使用highlightjs,仅仅先添加highlightjs后添加page.js到`<head>`也无法保证page.js会在highlightjs执行后执行,解决方法详见[无刷新加载](https://blog.phyer.cn/article/8935)
我的个人博客:https://blog.phyer.cn。欢迎访问
处理公共CDN突然失效的情况的更多相关文章
- 推荐国内外优秀+免费CDN加速站点及公共cdn加速库
-----------------------------------------------------------------免费CDN加速站点 1.CloudFlare CloudFlare可能 ...
- 推荐两个国外公共CDN服务
最近这个国家信息安全问题舆论形势又见紧张,Google的访问又被强力堵截,谷歌的公共CDN也顺带被波及,像AngularJS这样的前卫js库,国内几大公共CDN服务都不提供支持.国外目前两大第三方公共 ...
- 公共cdn的js和css库
使用cdn的js和css公用库 为什么要使用cdn,用cdn资源有什么好处了,可以看看yahoo性能建议,中间有一条的http://developer.yahoo.com/performance/ru ...
- 国内网站常用的一些 CDN 公共库加速服务
CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一 般的CDN公共库都会包含全球所有最流行的开源JavaScri ...
- 盘点国内网站常用的一些 CDN 公共库加速服务
CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一 般的CDN公共库都会包含全球所有最流行的开源JavaScri ...
- CDN公共库、前端开发常用插件一览表(VendorPluginLib)
=======================================================================================前端CDN公共库===== ...
- 国内站点经常使用的一些 CDN 静态资源公共库加速服务
web开发人员们的福利来了..旨在为大家提供更快很多其它更好的静态资源库的CDN载入库方案! CDN公共库是指将经常使用的JS库存放在CDN节点,以方便广大开发人员直接调用. 与将JS库存放在serv ...
- 盘点国内网站常用的一些 CDN 公共库加速服务(转载)
百度CND jQuery 地址:<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></scri ...
- 前端CDN公共库
通过使用公共的CDN脚本和样式库,可以在一定程度上加速访问.节省服务器流量.提升你的网站用户体验.本文将介绍国内比较常用的几种免费的CDN库,包括百度.新浪.360.又拍和七牛等. 百度CDN公共库 ...
随机推荐
- 计划任务crond
计划任务服务程序 计划任务分为以下两种情况:1.系统级别的定时任务:清理系统缓存临时文件清理系统信息采集日志文件切割 2.用户级别的定时任务:定时同步互联网时间定时备份系统配置文件定时备份数据库文件 ...
- com.google.zxing:core 生成二维码的简单使用
String content = ""; int size = 240; Hashtable<EncodeHintType, String> hints = new H ...
- 向通用自动驾驶部门Cruise投资22.5亿美元,软银打得什么主意?
5月29日,加利福尼亚州的一辆特斯拉Model S撞上停在路边的警车.据透露,当时这辆特斯拉正处于自动辅助驾驶即Autopilot模式.而在今年,这已经不是第一次特斯拉自动驾驶模式出问题了.此外,Ub ...
- Div水平垂直居中的三种方法
百度了很多种方法,很多是不起作用的.下面这些方法是我亲自试过的.希望对大家有帮助! 下面是一波代码水军. <!DOCTYPE html> <html lang="en&qu ...
- iOS传感器集锦、飞机大战、开发调试工具、强制更新、Swift仿QQ空间头部等源码
iOS精选源码 飞机大作战 MUPhotoPreview -简单易用的图片浏览器 LLDebugTool是一款针对开发者和测试者的调试工具,它可以帮... 多个UIScrollView.UITable ...
- [LC] 541. Reverse String II
Given a string and an integer k, you need to reverse the first k characters for every 2k characters ...
- C#常用到的命令及常用控件的属性
Application.Exit()应用程序退退出 this.Close()当前窗口退出 int h = DateTime.Now.Hour; //获取当前时间的小时部分 int m = D ...
- [LC] 224. Basic Calculator
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- 《时间线》:WWT 数字宇宙,虚拟星空
李北辰/文 王尔德说:我们生活在阴沟里,却仍有人仰望星空.如今,这句感叹依旧代表某种程度的正确,但这位19世纪的英国绅士有所不知:在一百多年后的东方"帝都",当困于阴沟中的年轻人们 ...
- 20180110labview串口传输实时显示相关内容
下一步:1.在原有文件不变的基础上,输出实时波形文件,完整的4pmt4ld,并将对应的源探布配通道编号显示在面板上,对应的通道数据索引输出.2.在一次测量OK的那个文件里用while指定字节读取,注意 ...