深入理解javascript中defer的作用


Posted in Javascript onDecember 11, 2013

很多人都已经把 Javascript的用的炉火纯青了,但见到defer未必就知道他是做什么用的;很多人也都遇到过这样的问题,需要直接执行别且操作DOM对象的js 总是报找不到对象的错误,原因大家也都知道就是页面还有没有加载完毕,js的操作对象还在下载中。但很多人都不知道,添加defer标签就能轻而易举的解决这个问题。

<script src="../CGI-bin/delscript.js" defer></script>

中的defer作用是文档加载完毕了再执行脚本,这样回避免找不到对象的问题---有点问题

<button id="myButton" onclick="alert('ok')">test</button>
<script>
myButton.click();
</script>
<script>
myButton.click();
</script>
<button id="myButton" onclick="alert('ok')">test</button>
<script defer>
function document.body.onload() {
alert(document.body.offsetHeight);
}
</script>

加上 defer 等于在页面完全在入后再执行,相当于 window.onload ,但应用上比 window.onload 更灵活!

defer是脚本程序强大功能中的一个“无名英雄”。它告诉浏览器Script段包含了无需立即执行的代码,并且,与SRC属性联合使用,它还可以使这些脚本在后台被下载,前台的内容则正常显示给用户。

--但是 文档加载完毕了再执行脚本

请注意两点:

1、不要在defer型的脚本程序段中调用document.write命令,因为document.write将产生直接输出效果。

2、而且,不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。

一个常用的优化性能的方法是:当脚本不需要立即运行时,在<SCRIPT>标签中设置“defer”属性。 (立即脚本没有被包含在一个function块中,因此会在加载过程中执行。) 设置“defer”属性后,IE就不必等待该脚本装载和执行完毕。这样页面加载会更快。一般来说,这也表明立即脚本最好放在function块中,并在 document或者body对象的onload 句柄中处理该函数。在有一些脚本需要依赖用户操作而执行时----例如点击按钮,或者移动鼠标到某个区域----使用该属性非常有用。但当有一些脚本需要在页面加载过程中或加载完成后执行,使用defer属性得到的好处就不太大。

script中的defer属性默认情况下是false的。按照DHTML编程宝典中的描述,对于Defer属性是这样写的:

Using the attribute at design time can improve the download performance of a page because the browser does not need to parse and execute the script and can continue downloading and parsing the page instead.

也就是说:如果是编写脚本的时候加入defer属性,那么浏览器在下载脚本的时候就不必立即对其进行处理,而是继续对页面进行下载和解析,这样会提高下载的性能。

这样的情况有很多种。比如你定义了很多javascript变量,或者在引用文件(.inc)中写了很多的脚本需要处理,那不妨在这些脚本中加入defer属性,对性能的提高肯定有所帮助。

举例如下:

<script language="javascript" defer>
var object = new Object();
....
</script>

因为defer属性默认是为false的,那么在这里

<script language="javascript" defer>

显式声明defer属性后等同于

<script language="javascript" defer=true>

声明了defer属性之后,需要判断是否有别的变量引用了defer脚本块中的变量,否则的话会导致脚本错误的产生。

Javascript 相关文章推荐
用js计算页面执行时间的函数
Dec 07 Javascript
JavaScript中“+=”的应用
Feb 02 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
Sep 08 Javascript
jQuery的运行机制和设计理念分析
Apr 05 Javascript
jquery插件开发注意事项小结
Jun 04 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
AngularJs 60分钟入门基础教程
Apr 03 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
Aug 15 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
Jun 04 Javascript
浅谈vue引入css,less遇到的坑和解决方法
Jan 20 Javascript
安装多版本Vue-CLI的实现方法
Mar 24 Javascript
React组件设计模式之组合组件应用实例分析
Apr 29 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
Dec 10 #Javascript
JQuery页面的表格数据的增加与分页的实现
Dec 10 #Javascript
jquery动态加载select下拉框示例代码
Dec 10 #Javascript
关于jquery中全局函数each使用介绍
Dec 10 #Javascript
jquery对ajax的支持介绍
Dec 10 #Javascript
jquerydom对象的事件隐藏显示和对象数组示例
Dec 10 #Javascript
鼠标选择动态改变网页背景颜色的JS代码
Dec 10 #Javascript
You might like
PHP4中实现动态代理
2006/10/09 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
python3.7.0的安装步骤
2018/08/27 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
python计算无向图节点度的实例代码
2019/11/22 Python
dpn网络的pytorch实现方式
2020/01/14 Python
python实现简单坦克大战
2020/03/27 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
生产部岗位职责范文
2014/02/07 职场文书
周年庆促销方案
2014/03/15 职场文书
学生会主席竞聘书
2014/03/31 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
家具商场的活动方案
2014/08/16 职场文书
法定代表人身份证明书
2014/09/10 职场文书