第二章 jQuery技术解密 (五)

2.3.5 引用 DOM 元素

jQuery() 函数能够直接接受 HTML 字符串,并把它们转换为 DOM 结构,这是上一节中所讲解的利用 jQuery() 函数生成 DOM 元素。当然,我们也可以看到 jQuery() 函数还可以接收 DOM 元素、DOM元素集合、HTML标签或者 ID 值。下面我们就来分析 jQuery.fn.init() 构造器是如何把这些类型的参数转换为 DOM 元素的。

对于 HTML 标签来说,它使用 document.getElementsByTagName() 方法获取 DOM 元素集合。对于 ID 参数来说,它使用 document.getElementById() 方法获取特定的 DOM 元素。另外,还可以使用 DOM 元素的 childNodes、firstChild、lastChild、nextSibling、parentNode 和 previousSibling 的属性引用 DOM 节点。

既然说 DOM 元素能够通过 lastChild、parentNode 等属性引用节点,jQuery 对象又是 DOM 元素的集合,因此,jQuery 就可以考虑通过整合 DOM 元素的这些属性来获得其集合中所有元素各自引用的节点。把这些间接引用的节点组合起来又构成了新的 DOM 元素集合。下面我们就来分析 jQuery 是如何引用节点的。

[html]view
plain
copy

  1. //通过each()方法为jQuery对象映射一组引用DOM节点的方法
  2. jQuery.each({
  3. parent:function(elem){returnelem.parentNode;},//引用父节点
  4. parents:function(elem){returnjQuery.dir(elem,"parentNode");},//引用所有父节点
  5. next:function(elem){returnjQuery.nth(elem,2,"nextSibling");},//引用相邻的下一个DOM元素
  6. prev:function(elem){returnjQuery.nth(elem,2,"previousSibling");},//引用相邻的上一个DOM元素
  7. nextAll:function(elem){returnjQuery.dir(elem,"nextSibling");},//引用所有后继DOM元素
  8. prevAll:function(elem){returnjQuery.dir(elem,"previousSibling");},//引用所有前继DOM元素
  9. sibling:function(elem){returnjQuery.sibling(elem.parentNode.firstChild,elem);},//引用相邻DOM元素
  10. children:function(elem){returnjQuery.sibling(elem.firstChild);},//引用所有子元素
  11. //如果存在iframe,则就是文档,或者所有子节点
  12. //elem.contentDocument||elem.contentWindow.documentiframe的属性
  13. //http://devoloper.mozilla.org/on/docs/XUL:iframe
  14. contents:function(elem){returnjQuery.nodeName(elem,"iframe")?elem.contentDocument||
  15. elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
  16. },function(name,fn){
  17. //为jQuery对象注册同名方法
  18. jQuery.fn[name]=function(selector){
  19. //每个元素都执行同名方法
  20. varret=jQuery.map(this,fn);
  21. //过滤元素集
  22. if(selector&&typeofselector=="string")
  23. ret=jQuery.multiFilter(selector,ret);
  24. //返回构建的jQuery对象
  25. returnthis.pushStack(jQuery.unique(ret),name,selector);
  26. };
  27. });

在上面的代码中,为 jQuery 对象绑定了一组方法,这些方法能够引用不同位置的节点,主要包括父节点、子节点和兄弟节点三类。

  • 对于父节点引用来说,可以引用当前 DOM 元素的父亲节点,也可以获得所有父级节点,包括祖先节点。
  • 对于子节点引用来说,就是可以引用所有直接的子节点,但不包括不相邻的后代节点。
  • 对于兄弟节点引用来说,可以引用包括当前 DOM 元素的前或后相邻节点,也包括前后相近的所有元素。

jQuery 通过 jQuery.each() 公共函数把这个节点引用的方法注册到 jQuery.fn 原型对象中,即 jQuery 对象的同名方法中。因为 jQuery 对象的 DOM 元素是一个集合,所以就必须对集合中每个 DOM 元素执行相同的操作,也就是说为每个 DOM 元素调用属性包含的函数,如 parent: function(elem){return elem.parentNode;}; 中的 function(elem){return elem.parentNode;} 。

当然,在引用的节点中,还包括很多重复的 DOM 元素,或者用户需要过滤的其他节点,这些操作都需要利用过滤函数进行过滤,关于这个话题将在 CSS 选择器一节中进行详细的讲解。

在上面定义的 jQuery 对象方法中,jQuery 也提供了几个公共函数: jQuery.dir()、jQuery.nth() 和 jQuery.sibling() 来辅助完成引用 DOM 节点。下面我们来分析这几个公共函数的用法。

[html]view
plain
copy

  1. //从一个元素出发,检索某个方向上的所有元素
  2. //如可以把元素的parentNode、nextSibling、previousSibling、lastChild、firstChild属性作为方向
  3. //参数说明:
  4. //elem参数表示起点元素
  5. //dir参数表示元素的方向属性,如parentNode、nextSibling、previousSibling、lastChild、firstChild
  6. jQuery.dir=function(elem,dir){
  7. varmatched=[],cur=elem[dir];
  8. //逐级迭代访问,直到访问到document节点
  9. while(cur&&cur!=document){
  10. if(cur.nodeType==1)//Element类型
  11. matched.push(cur);
  12. cur=cur[dir];//向上一级传递节点
  13. }
  14. returnmatched;
  15. };

dir 是 direction(方向) 一词的缩写,表示朝一个方向一直迭代到尽头。例如,parentNode 能够把父节点作为当前节点,再取其父节点,通过这种方式可以迭代到 document 对象为止。另外,对于 nextSibling、previousSibling、lastChild 和 firstChild 元素属性都具有方向性,因此只要获取元素具有
dir (方向) 特性的属性,就可以反复迭代读取。每循环一次都会把取到的元素保存起来。

所以说,dir() 函数对于检索 DOM 文档树中呈放射线性排列的元素来说,是非常有用的。但是如果要检索在某个方向上的第几个元素,如检索偶数序号位置的元素,就需要使用 nth() 函数。该函数的源代码如下所示。

[html]view
plain
copy

  1. //从一个元素出发,检索某个方向上的第几个元素。参数Result是第几个
  2. //参数说明:
  3. //cur参数表示起点元素
  4. //dir参数表示元素的方向属性,如parentNode、nextSibling、previousSibling、lastChild和firstChild
  5. //result参数表示级数,默认值为1
  6. //elem参数是一个无用参数
  7. jQuery.nth=function(cur,result,dir,elem){
  8. result=result||1;
  9. varnum=0;
  10. for(;cur;cur=cur[dir])
  11. if(cur.nodeType==1&&++num==result)
  12. break;
  13. returncur;
  14. };

jQuery.nth() 函数与 jQuery.dir() 函数在设计思路上是完全相同的,但是 jQuery.dir() 函数不包含自身,而 jQuery.nth() 函数可以包含自身,如果 jQuery.nth() 函数的参数 result 等于 1,则返回自身元素。如果没有找到元素则返回空,如 undifined 或 null 。

jQuery.sibling() 函数就比较简单,但是没有上面两个方法有用。它实现了从一个元素(包括自身)检索所有后续相邻元素,然后再从这个后续的相邻元素排除一个指定元素。例如:

[html]view
plain
copy

  1. //从包含参数n的元素开始检索所有后续相邻元素,但不包含参数elem指定的元素
  2. //参数说明:
  3. //n参数表示起点元素
  4. //elem参数排除元素
  5. jQuery.sibling=function(n,elem){
  6. varr=[];
  7. for(;n;n=n.nextSibling){
  8. if(n.nodeType==1&&n!=elem)
  9. r.push(n);
  10. }
  11. returnr;
  12. };
时间: 2024-09-21 03:35:49

第二章 jQuery技术解密 (五)的相关文章

第二章 jQuery技术解密(一)

2.2 jQuery 原型技术分解 任何复杂的技术都是从最简单的问题开始的,如果你被 jQuery 几千行庞杂结构的源代码所困惑,那么建议你阅读本节内容,我们将探索 jQuery 是如何从最简单的问题开始,并逐步实现羽翼渐丰的演变过程,从 jQuery 核心技术的还原过程来理解 jQuery 框架的搭建原理. 2.2.1 起源 -- 原型继承 用过 JavaScript 的读者都会明白,在 JavaScript 脚本中到处都是函数,函数可以归置代码段,把相对独立的功能封装在一个函数包中.函数也可

第二章 jQuery技术解密 (二)

2.2.6 延续 -- 迭代器 在 jQuery 框架中,jQuery 对象是一个很奇怪的概念,具有多重身份,所以很多初学者一听说 jQuery 对象就感觉很是不解,误以为它是 John Resig 制造的新概念.我们可以对jQuery 对象进行如下分解. 第一,jQuery 对象是一个数据集合,它不是一个个体对象.因此,你无法直接使用 JavaScript 的方法来操作它. 第二,jQuery 对象实际上就是一个普通的对象,因为它是通过 new 运算符创建的一个新的实例对象.它可以继承原型方法

第二章 jQuery技术解密 (六)

2.4 解析 jQuery 选择器引擎 Sizzle jQuery 从 1.3 版本开始,使用了新的选择器引擎 Sizzle(官方网址 http://sizzlejs.com) .Sizzle 是 jQuery 作者 John Resig 开发的 DOM 选择器引擎 (Dom Selector Engine),速度号称业界第一.而且它有一个重要的特点就是 Sizzle 是完全独立于 jQuery 的,如果用户不想用 jQuery ,还可以只用 Sizzle . Sizzle 选择器引擎目前成为

第二章 jQuery技术解密 (四)

2.3.4 生成 DOM 元素 jQuery.fn.init() 构造函数能够构建 jQuery 对象,并把匹配的 DOM 元素存储在 jQuery 对象内部集合中.jQuery.fn.init() 构造函数可以接收单个的 DOM 元素,也可以接收 DOM 集合.如果接收的是字符串型 ID 值,则直接在文档中查找对应的 DOM 元素,并把它传递给 jQuery 对象:如果接收的是字符串型 HTML 片段,则需要把这个字符串片段生成 DOM 元素.下面我们将重点分析 jQuery 是如何把 HTM

第二章 jQuery技术解密 (七)

2.4.5 Sizzle 构造器 在 jQuery.fn.init() 构造器中,通过调用 jQuery(context).find(selector) 函数来解析并匹配 DOM 元素.jQuery.find() 函数实际上是引用 Sizzle() 函数,而 Sizzle() 函数仅是 Sizzle 引擎的构造器,它主要调用 Sizzle.find() 函数在 DOM 文档树中查找与 CSS 语法相匹配 DOM 的元素节点的集合.jQuery 名字中 Query 的意义就体现在这里.下面我们来分

《众妙之门——JavaScript与jQuery技术精粹》——第1章 初学JavaScript 需知的七件事 1.1 缩略标记

第1章 初学JavaScript 需知的七件事 我很早以前就开始编写JavaScript代码,很高兴看到这种语言在今天所取得的成功,能成为这个成功故事中的一部分我很开心.关于JavaScript,我写过许多文章.章节以及一整本书,直到今天我仍在寻找新的东西.下文是一些我工作学习过程中激动时刻的记录,大家与其守株待兔,不如自己尝试去体会这种感受. 1.1 缩略标记 众妙之门--JavaScript与jQuery技术精粹 在创建对象和数组过程中可以使用缩略标记是我喜欢JavaScript的重要原因之

> 第二章 NGWS Runtime 技术基础(rainbow 翻译) (转自重粒子空

<<展现C#>> 第二章 NGWS Runtime 技术基础(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch02.shtml 正文: 第二章  NGWS  runtime 技术基础     既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌.C#依靠由NGWS提供的运行时:因此,有必要知道运行时如何工作,以及它背后所蕴含的概念.    所以,这一章分为两部分--它

深入理解bootstrap框架之第二章整体架构_jquery

一. 整体架构 1. CSS-12栅格系统 把网页宽度均分为12等分(保留15位精度)--这是bootstrap的核心功能. 2.基础布局组件 包括排版.按钮.表格.布局.表单等等. 3.jQuery bootstrap插件的基础 4.响应式设计 兼容多个终端.这是bootstrap的终极理念. 5.css插件 提供丰富的样式. 6.js插件 二. 栅格系统 1.基本实现过程 定义容器的大小--跳转边距--媒询 有以下要求: (1)一行(row)数据必须包含在.container中. .cont

《众妙之门——JavaScript与jQuery技术精粹》——导读

前 言 众妙之门--JavaScript与jQuery技术精粹 对于网站开发设计人员而言,在面对选择解决方案时做出正确的决定并不容易.不论是在建立复杂的网站应用还是在改进网站的过程中,都会有很多前期解决方案可供选择,有时选择最合适的一款方案至关重要.本书着重讲述了在选择相应解决方案时务必要注意的事项,即是否稳定并易于定制.是否有实用性并易于理解.是否具有可维护性.兼容性,以及功能的可拓展性. 本书重点阐述了检验代码的重要性以及在执行JavaScript程序时需要避免的问题.所选择的解决方案应能符