深入理解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 相关文章推荐
Jquery中Ajax 缓存带来的影响的解决方法
May 19 Javascript
提取jquery的ready()方法单独使用示例
Mar 25 Javascript
js中confirm实现执行操作前弹出确认框的方法
Nov 01 Javascript
jQuery简单获取键盘事件的方法
Jan 22 Javascript
jquery过滤特殊字符',防sql注入的实现方法
Aug 17 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
详解Vue.js分发之作用域槽
Jun 13 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
详解Vue demo实现商品列表的展示
May 07 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
Sep 02 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中的Session和Cookie
2013/06/21 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
jquery创建div 实现代码
2009/04/27 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
js实现左右轮播图
2020/01/09 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
八年级物理教学反思
2014/01/19 职场文书
团队经理竞聘书
2014/03/31 职场文书
初三学生个人自我评定
2014/04/06 职场文书
财务管理专业自荐书
2014/09/02 职场文书
创先争优活动心得体会
2014/09/04 职场文书
2014年科研工作总结
2014/12/03 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js