关于延迟加载JavaScript


Posted in Javascript onMay 05, 2015

JavaScript的延迟加载是那些在web上,能让你想抓狂地去寻找解决方案的问题之一。

很多人说“那就用defer”或“async”,甚至有些人说“那就将你的javascript代码放在页面代码底部”。

上述方法都不能解决在web页面完全加载后,再加载外部js的问题。上述方法也会偶尔让你收到Google页面速度测试工具的“延迟加载javascript”警告。所以这里的解决方案将是来自Google帮助页面的推荐方案。

如何延迟加载JavaScript

下面是Google推荐的代码。这些代码应被放置在</body>标签前(接近HTML文件底部)。另外,我将外部JS文件名突出显示。

<script type="text/javascript">
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "defer.js";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>

这里做了什么?
这段代码意思是等到整个文档加载完后,再加载外部文件“defer.js”。

具体说明

1.复制上面代码

2.粘贴代码到HTML的</body>标签前 (靠近HTML文件底部)

3.修改“defer.js”为你的外部JS文件名

4.确保你文件路径是正确的。例如:如果你仅输入“defer.js”,那么“defer.js”文件一定与HTML文件在同一文件夹下。

这段代码能用在哪里(和哪里不能用)

这段代码直到文档加载完才会加载指定的外部JS文件。因此,不应该把那些页面正常加载需要依赖的javascript代码放在这里。而应该将JavaScript代码分成两组。一组是因页面需要而立即加载的javascript代码,另外一组是在页面加载后进行操作的javascript代码(例如添加click事件或其他东西)。这些需等到页面加载后再执行的JavaScript代码,应放在一个外部文件,然后再引进来。

例如,在这页面我使用上述文件进行延迟加载 - Google analytics,Viglink (我怎么赚钱),和显示在底部的Google+徽章(我的社交媒体)。这对于我来说,没有理由在初始页面加载时加载这些文件,因为初始阶段都没必要加载上述无关紧要的内容。也许在你的页面中也有同样性质的文件。那你难道想让用户在看到网页内容之前,还要等待这些文件加载吗?

为什么不使用其它方法呢?

直接插入代码、将脚本放置在底部和使用“defer”或“async”,这几种方法都不能达到先加载页面后加载JS的目的,而且它们肯定不能在各个浏览器上表现一致。

它为什么重要?

它的重要性是由于Google将页面速度作为排名因素之一而且用户也希望能快速加载页面。另外对于移动搜索引擎优化也是非常重要的。Google根据页面最初加载时间来衡量页面速度。这意味着你必须尽可能快地得到页面的load事件。页面最初加载时间是Google用来评价你的web页面质量(而且别忘记用户在等待页面的加载)。Google积极推进和推荐将上述的无关紧要的内容按重要性排列,让所有资源(js,css,images等)脱离关键的渲染路径,而且这样做是值得去努力的。如果这样能取悦用户,且让Google开心,你很应该这样做。

用法示例

我已创建一个页面,在这个页面你可看到这段代码的使用。

让你测试的示例文件

好的,为了说明,我已制作几个示例页面让你进行测试。每个页面都做同一样的事情。这是一个普通的HTML页面,含有一个等待2秒然后输出“hello world”的javascript脚本。你可以测试这些文件,然后你会看到只有一种方法,它的加载时间是不包括2秒的等待时间。

直接插入脚本的页面 ? 点击这里

带有使用“defer”外部脚本的页面 ? 点击这里
使用上述推荐代码的页面 ? 点击这里

关键点

压倒一切的首要任务应该是尽可能快地交付内容给用户。而我们一直没想着如何对待我们的javascript代码。但用户不应该为一些无关紧要的脚本,而被迫地为内容而作出等待。无论你的页脚多酷,都没理由让一个可能从不滚动到页脚的用户,去加载那些让页脚变酷的javascript文件。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
比较简单的一个符合web标准的JS调用flash方法
Nov 29 Javascript
jquery 应用代码 方便的排序功能
Feb 06 Javascript
JQuery 技巧和窍门整理(8个)
Apr 22 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
Aug 26 Javascript
移动端点击态处理的三种实现方式
Jan 12 Javascript
在Vue中使用echarts的实例代码(3种图)
Jul 10 Javascript
vue.js项目中实用的小技巧汇总
Nov 29 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
Dec 09 Javascript
vue iView 上传组件之手动上传功能
Mar 16 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
Sep 23 Javascript
Javascript闭包(Closure)详解
May 05 #Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 #Javascript
JS实现点击按钮后框架内载入不同网页的方法
May 05 #Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 #Javascript
jquery实现图片随机排列的方法
May 04 #Javascript
jquery实现的美女拼图游戏实例
May 04 #Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
May 04 #Javascript
You might like
PHPCMS的使用小结
2010/09/20 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php字符串截取函数用法分析
2014/11/25 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
asm.js使用示例代码
2013/11/28 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
争先创优心得体会
2014/09/12 职场文书
看上去很美观后感
2015/06/10 职场文书
教师节感想
2015/08/11 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers