深入理解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的变量值传递给ASP变量
Dec 10 Javascript
jQuery对Select的操作大集合(收藏)
Dec 28 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
JS实现方向键切换输入框焦点的方法
Aug 19 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
Feb 17 Javascript
JavaScript必知必会(三) String .的方法来自何方
Jun 08 Javascript
JS制作适用于手机和电脑的通知信息效果
Oct 28 Javascript
js中通过getElementsByName访问name集合对象的方法
Oct 31 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
详解组件库的webpack构建速度优化
Jun 18 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
Sep 04 Javascript
微信jssdk踩坑之签名错误invalid signature
May 19 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
深入PHP变量存储的详解
2013/06/13 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
python之yield表达式学习
2014/09/02 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
项目副经理岗位职责
2013/12/30 职场文书
同学聚会老师邀请函
2014/01/28 职场文书
班干部演讲稿
2014/04/24 职场文书
装修施工安全责任书
2014/07/24 职场文书
2014年新教师工作总结
2014/11/08 职场文书
大学军训决心书
2015/02/05 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
vue如何清除浏览器历史栈
2022/05/25 Vue.js