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 ...
随机推荐
- tomcat配置多个web网站的配置详解
假如只有一台服务器,需要配置多个web网站(端口不同我还没试),该怎么样配置tomcat呢,其实很简单,只需要将tomcat 下面的 server.xml 中增加两个甚至是多个<Host> ...
- jsp <c:forEach> 判断第一条 或 最后一条记录
<c:forEach>标签具有以下一些属性: var:迭代参数的名称.在迭代体中可以使用的变量的名称,用来表示每一个迭代变量.类型为String. items:要进行迭代的集合.对于它所支 ...
- 对XML和YAML文件实现I/O操作
1.文件的打开关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: string filename = "I.xml"; FileStora ...
- UISegmetControl
一.UISegmentControl是一个分段控件,父类是UIControl,内涵数个button,并且都有对应下标index: NSArray *titles = @[@"护卫队" ...
- jbpm4.4 demo2
package cn.itcast.b_processdefinition; import java.io.FileInputStream; import java.io.FileOutputStre ...
- Mac RTX
http://bbs.weiphone.com/read-htm-tid-1876850.html 公司的rtx还是2010的,如果是2011的就有mac版的了.直接到官网下. 那还是用2010的,尼 ...
- How to save/read file on different platforms
You can use standard c functions, such as fopen, fwrite, to save and read file on different platform ...
- 插件化技术在安卓sdk开发中实际应用
笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版.先来说说需求. 由于笔者所在一家创业公司, android sdk ...
- android zxing自定义界面,点击按钮开关闪光灯
折腾了一天,今天基本把自定义扫描二维码界面实现了,主要碰到的问题是文本过长,要居中并换行,绘制图片,点击切换不同图片,打开或关闭闪关灯,结果发现在一些机型上出现空指针异常,又牵扯到硬件加速问题...参 ...
- C++ notes for beginners
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...