对于Dom元素显示和隐藏的操作,jQuery提供了比较方便的函数,我们也经常使用:

1. show() : 显示Dom元素
2. hide() : 隐藏Dom元素
3. toggle() : 改变Dom元素的显示状态,如果当前是显示状态函数运行后则会隐藏

也曾想过这三个函数的实现原理,如果以为是简单的设置样式,改变display属性的值设置为block或是none。那就错了,看了下jQuery2.0.3的源码,了解了这三个函数的实现原理,其实实现的逻辑还有点小复杂,下面来介绍下具体实现:

1、 数据存储Data

 
(1) 概述
 

为什么要说数据存储呢,和Dom元素的隐藏和显示好像没有关系。其实jQuery用数据存储Data类和cache来保存每一个Dom元素之前的display状态。

jQuery中Data类是用来进行数据管理的,一共创建了两个实例对象:

data_user = new Data();
data_priv = new Data();

在Dom元素显示和隐藏功能中就用到了data_priv对象。

 
(2) 存储逻辑
 

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)的更多相关文章

  1. jQuery控制元素隐藏和显示

    1.jQuery隐藏和显示效果 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").click(functio ...

  2. jquery dom ready, jqery2.1.1实现-源码分析

    本文链接http://www.cnblogs.com/Bond/p/4178311.html jquery document  ready的实现其很很简,虽说简单,其很很多人还是没去关注过它的实现.我 ...

  3. Jquery DOM元素的方法

    jQuery DOM 元素方法 函数 描述 .get() 获得由选择器指定的 DOM 元素. .index() 返回指定元素相对于其他指定元素的 index 位置. .size() 返回被 jQuer ...

  4. 深度解析JQuery Dom元素操作技巧

    深度解析JQuery Dom元素操作技巧 DOM是一种与浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件,这篇文章给大家介绍了JQuery dom元素操作方法,写的十分的全面细 ...

  5. jQuery DOM 元素方法(get)

    jQuery DOM 元素方法 1..get() 获得由选择器指定的 DOM 元素. $(selector).get(index)index 可选.规定获取哪个匹配元素(通过 index 编号). 实 ...

  6. 深入理解Faiss 原理&源码 (一) 编译

    目录 深入理解Faiss 原理&源码 (一) 编译 mac下安装 安装mac xcode工具包 安装 openblas 安装swig 安装libomp 编译faiss 附录 深入理解Faiss ...

  7. 在MyEclipse显示struts2源码和doc文档及自动完成功能

    分类: struts2 2010-01-07 16:34 1498人阅读 评论(1) 收藏 举报 myeclipsestruts文档xmlfileurl 在MyEclipse显示struts2源码和d ...

  8. c# winform 中的 工具栏自动隐藏 splitter用法 带源码

    c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313

  9. SharedPreferences 原理 源码 进程间通信 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. 前端javascript规范文档 (http://www.xuanfengge.com/category/web)

    说明:本文档为前端JS规范 一.规范目的 为提高团队协作效率,便于前端后期优化维护,输出高质量的文档. 二.基本准则 符合web标准,结构表现行为分离,兼容性优良.页面性能方面,代码要求简洁明了有序, ...

  2. 遇到Class Not registered的COM异常怎么办

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:遇到Class Not registered的COM异常怎么办.

  3. Kinect for Windows SDK开发入门(15):进阶指引 下

    Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...

  4. 用sharding技术来扩展你的数据库(一)sharding 介绍

    数据库的sharding技术作为一个“新瓶装旧酒”的概念,在新的应用环境中被赋予了新的意义.随着云计算的发展,sharding在最近几年是越来越火热,越来越多的产品开始声称自己支持sharding功能 ...

  5. linux jmail乱码

    在Windows 里面,标题和内容都正常, 在linux里面,--- 1.字符串 more /etc/sysconfig/i18n   export LANG=en_US.UTF-8 ====默认是e ...

  6. [转]Reducing script compile time or a better workflow to reduce excessive recompiling

    http://forum.unity3d.com/threads/148078-Reducing-script-compile-time-or-a-better-workflow-to-reduce- ...

  7. SQL Server数据库PIVOT函数的使用详解(二)

    动态的行转列 原理就是 把需要转成列的行拼出来 DECLARE @fieldName VARCHAR(); SET @fieldName=''; SELECT @fieldName = @fieldN ...

  8. android中利用实现二级联动的效果

    按照惯例,首先上一张效果图. 本篇文章实现的效果就是如图中所圈的那样,实现类似于HTML中的二级联动的效果. 对于第一个选项我们读取的是本地xml文件来填充数据的, 对于第二个选项我们读取的是通过中央 ...

  9. cocos js响应过程

    使用ccbi: js加载ccbi时候,会调用CCBReader的函数readNodeGraphFromData,从根节点递归解析子节点,使用readNodeGraph函数解析单个节点. 当碰到CCMe ...

  10. MAC终端显示隐藏文件,关闭显示

    1.显示隐藏文件夹显示:defaults write com.apple.finder AppleShowAllFiles -bool true (1)复制“defaults write com.ap ...