jQuery--Dom元素隐藏和显示原理(源码2.0.3)
对于Dom元素显示和隐藏的操作,jQuery提供了比较方便的函数,我们也经常使用:
1. show() : 显示Dom元素
2. hide() : 隐藏Dom元素
3. toggle() : 改变Dom元素的显示状态,如果当前是显示状态函数运行后则会隐藏
也曾想过这三个函数的实现原理,如果以为是简单的设置样式,改变display属性的值设置为block或是none。那就错了,看了下jQuery2.0.3的源码,了解了这三个函数的实现原理,其实实现的逻辑还有点小复杂,下面来介绍下具体实现:
1、 数据存储Data
为什么要说数据存储呢,和Dom元素的隐藏和显示好像没有关系。其实jQuery用数据存储Data类和cache来保存每一个Dom元素之前的display状态。
jQuery中Data类是用来进行数据管理的,一共创建了两个实例对象:
data_user = new Data();
data_priv = new Data();
在Dom元素显示和隐藏功能中就用到了data_priv对象。
Data类的prototype方法有:
key(), set(), get(), access(), Remove(), hasData(), discard()
key()函数需要传入一个Dom元素,在函数中会将这个Dom元素通过defineProperties()函数绑定一个unlock值。Unlock值是一个自增的整数Data.uid。
这样就有了一个Dom元素对应一个key值,然后保存到cache中:
Cache[unlock] [‘key’] = value; (在Dom隐藏和显示时key的值是olddisplay)
例子:Cache2['olddisplay'] = 'block'
这样就会保存每一个Dom的display的状态了。其中get(), set()函数通过传参可以获取和保存display状态。
2、 主要功能函数showHide ( elements, show )
参数说明:
(1) Elements参数:指的是需要显示或是隐藏的dom元素(可以是一个数组),Showhide函数会遍历elements进行处理。
(2) show参数: 表示是否进行dom显示,可以传递true。如果需要隐藏,则不用传入任何参数,当然false也是可以的。
在Dom元素显示的时候,jQuery会先判断cache中保存的display属性的值,如果有值例如block,则会将display设置为该值。否则会通过css_defaultDisplay()函数将Dom元素的display设置为创建时的默认值,然后将这个display的属性值保存在cache中。
在进行Dom元素隐藏的时候,就是将display属性的值设置为none。
show函数、hide函数、toggle函数实现就是调用这个主要的功能函数showHide(),传入不同的参数。其中toggle函数会用isHidden()函数先判断当前元素的显示状态。
3、css_defaultDisplay()函数实现原理:
jQuery会先从elemdisplay对象中寻找相应元素标签的display属性,如果存在即返回。 elemdisplay初始化值:{ BODY: "block" }
如果不存在则会在body中添加一个新的该标签的Dom元素,取它的display属性的值。这个时候就会有一个情况,如果用户在样式表中设置了该标签的display属性是none,那么取到的值就是none。
jQuery针对这个问题,做了特殊处理,新建一个iframe然后在这个iframe中创建一个新的该标签,然后取它的display属性的值,这样就不会受用户样式表的影响了。取到的display属性默认值将添加到elemdisplay对象当中,方便下次取用。
jQuery--Dom元素隐藏和显示原理(源码2.0.3)的更多相关文章
- jQuery控制元素隐藏和显示
1.jQuery隐藏和显示效果 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").click(functio ...
- jquery dom ready, jqery2.1.1实现-源码分析
本文链接http://www.cnblogs.com/Bond/p/4178311.html jquery document ready的实现其很很简,虽说简单,其很很多人还是没去关注过它的实现.我 ...
- Jquery DOM元素的方法
jQuery DOM 元素方法 函数 描述 .get() 获得由选择器指定的 DOM 元素. .index() 返回指定元素相对于其他指定元素的 index 位置. .size() 返回被 jQuer ...
- 深度解析JQuery Dom元素操作技巧
深度解析JQuery Dom元素操作技巧 DOM是一种与浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件,这篇文章给大家介绍了JQuery dom元素操作方法,写的十分的全面细 ...
- jQuery DOM 元素方法(get)
jQuery DOM 元素方法 1..get() 获得由选择器指定的 DOM 元素. $(selector).get(index)index 可选.规定获取哪个匹配元素(通过 index 编号). 实 ...
- 深入理解Faiss 原理&源码 (一) 编译
目录 深入理解Faiss 原理&源码 (一) 编译 mac下安装 安装mac xcode工具包 安装 openblas 安装swig 安装libomp 编译faiss 附录 深入理解Faiss ...
- 在MyEclipse显示struts2源码和doc文档及自动完成功能
分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...
- c# winform 中的 工具栏自动隐藏 splitter用法 带源码
c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313
- SharedPreferences 原理 源码 进程间通信 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- 跑马灯效果的TextView之singLine 和maxLines
Android 的TextView 里面有两个属性 singLine 和maxLines . 从字面意思来理解,这两个都是限制Text的行数.那么singleLine="true" ...
- Java- 类型转换
有两个方法: Integer.valueOf 和 String.valueOf 注: 字串转成 Double, Float, Long 的方法大同小异.
- Unity3D 导入贴图、模型等资源文件时自动设置参数
脚本继承至AssetPostprocessor, 存放在Editor目录下! using UnityEngine; using System.Collections; using UnityEdito ...
- 正则表达式_matches(Regex)
[0-9a-zA-Z.%+-] 匹配中括号中的 0-9 或者 a-z 或者 A-Z 或者 . 或者 % 或者 + 或者 - $p = "111,222,333"$p -match ...
- Android SimpleAdapter源码详解
一直没认真看过android的源码,也不太敢看,稀里糊涂也敲了一年的代码,现在想好好学习了,就把常用的源码都看了一下,小伙伴们来涨姿势吧,有错误的地方,直接指出,我脸厚不怕丢人.来吧. 刚开始学and ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- 漏洞大爆光:QQ漏洞、飞秋漏洞、360浏览器劫持…
随着互联网应用的高速发展,信息安全已深入到诸多领域,前段时间发生的"Struts 2"漏洞及"心脏出血"漏洞影响了二亿中国网民的信息安全.原因是程序猿缺少细致的 ...
- 嵌入式Qt4.7.1安装详解
嵌入式Qt 4.7.1安装移植过程详解环境:Ubuntu 12.04VMware 9.0 qt软件包:qt-everywhere-opensource-src-4.7.1.tar.gz (飞凌自带) ...
- 整理 iOS 9 适配中出现的坑
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级 ...
- MVC架构杂谈
来源:伯乐在线专栏作者 - 林欣达 链接:http://ios.jobbole.com/86895/ 点击 → 了解如何加入专栏作者 前言 MVC是软件工程中的一种软件架构模式,它把软件系统分为三个基 ...