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是32位还是64位
原文地址:http://www.cnblogs.com/andysd/p/3940976.html
- codis集群和redis cluster的优劣对比
1.codis架构如下: (1)Codis是一整套缓存解决方案,包含高可用.数据分片.监控.动态扩态 etc..走的是 Apps->代理->redis cluster,一定规模后基本都采用 ...
- 要注意null合并运算符的优先级比+还要低
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:要注意null合并运算符的优先级比+还要低.
- mybatis generator 使用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- C、Shell、Perl基于Tomcat开发CGI程序环境配置
基于Tomcat7.0版本号配置CGI开发环境,步聚例如以下: 以我的Tomcat7安装文件夹为例:TOMCA_HOME = /Users/yangxin/Documents/devToos/java ...
- careercup-树与图 4.7
4.7 设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先.不得将额外的结点储存在另外的数据结构中.注意:这不一定是二叉查找树. 解答 本题的关键应当是在Avoid storing addit ...
- 什么是Cocos2d-x
以下是官方对Cocos2d-x的说明." Cocos2d-x is an open-source mobile 2D game framework, released under ...
- Eclipse错误
1.java compiler level does not match the version of the installed java project facet 解决:http://blog. ...
- 学习tcl的资源
在这里介绍一些学习tcl的资源,有问题的时候可以尝试从这些资源中获取帮助. 网站: http://www.tcl.tk 官方站点 http://www.scriptics ...
- 20160330javaweb之session 小练习
练习一:session 实现登录注销 package com.dzq.session.logout; import java.util.*; public class UserDao { /** * ...