在介绍了《JavaScript DOM修改文档树方法实例》与《JavaScript DOM实战:创建和克隆元素》,本文将介绍JavaScript DOM文档遍历的详细知识,我们先从HTML页面最基本的组成元素讨论起:
我们提供的服务有:成都网站设计、网站制作、微信公众号开发、网站优化、网站认证、池州ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的池州网站制作公司
访问元素,你应该明白它是该文件的document元素,那你就可以使用document的documentElement属性:
- var oHtml=document.documentElement;//可以直接访问元素
- alert("节点名称 : "+oHtml.nodeName);//节点名称
- alert("节点类型 : "+oHtml.nodeType);//节点类型为 1
获取
和 元素:
- var oHead=oHtml.firstChild;//HEAD节点
- var oBody=oHtml.lastChild;//BODY节点
也可以通过childNodes属性,获取
和 元素:
- var oHead=oHtml.childNodes.item(0);//HEAD节点
- //var oHead=oHtml.childNodes[0];//简写,也有同样的结果是HEAD节点
- var oBody=oHtml.childNodes.item(1);//BODY节点
- //var oBody=oHtml.childNodes.item(1);//简写,也有同样的结果是BODY节点
注意:方括号标记其实是NodeList在javascript中的简便实现。实际上正式的从childNodes列表中获取子节点的方法是使用item()方法:HTML DOM 中的专有属性 document.body ,它常用于直接访问元素:
- var oBody=document.body;
既然我们都知道了以上节点对象的获取方式,那我们用oHtml,oHead,oBody 这三个变量来确定一下它们之间的关系:
- alert(oHead.parentNode==oHtml);//HEAD节点的父节点是BODY节点,返回 true
- alert(oBody.parentNode==oHtml);//BODY节点的父节点是BODY节点,返回 true
- alert(oBody.previousSibling==oHead);//BODY节点的上一个兄弟节点是HEAD节点 ,返回 true
- alert(oHead.nextSibling==oBody);//HEAD节点的下一个兄弟节点是BODY节点,返回 true
- alert(oHead.ownerDocument==document); //返回一个节点的根元素(Document),HEAD节点是否指向该文档,返回 true
通过上面的学习我们已经了解遍历节点的最基本的方式, 也学会了如何找到某一个节点的兄弟节点及它的子节点。
#p#
复杂的节点遍历
在上面的学习中我们好像没有遇到过大的阻碍,下面我们以一个“导航条”为实例:
首先我想把看一下我的导航条下有多少个子节点。我***想到的是前面我学过的查找元素的2种方法:
◆getElementById() # 通过ID属性查找元素
该方法将返回一个与那个有着给定id属性值的元素节点相对应的对象。
◆getElementsByTagName() # 通过标签名称查找元素
该方法返回一个对象数组,每个对象分别对应着文档里有着给定标签的一个元素。
节点遍历
那我们接下来,测一下是否是我们想要的东西:
先看一下***个方法queryElementsId()好像我们在IE中没有发现有什么问题,那我们在Firefox中看一下是否也是我们想要的结果。
这时,问题出现了,不同的浏览器在判断何为Text节点上存在着一些差异,例如在A级浏览器中的FF和IE就有很大的差异,FireFox会把元素之间的空白、换行、tab都是Text节点,IE下会把空白全部忽略掉,只有内联元素(如em,span)后的换行、空格、tab会被认为是一个Text。既然遇到了问题那我们就得解决问题,问题的根源我们也知道了,那相应的解决方案就好做了。
方法一:
方法二:
方法三:推荐
好了,我们在验证一下,#Text节点问题是否处理掉了。那我们就用方法3 中removeWhitespace(nav)方法来处理queryElementsId()方法中的#Text节点问题。
正如看到的结果,IE和FireFox中都没有问题了。
#p#
一个比较通用的方法:
用元素节点的DOM属性遍历DOM树
写到这里,既然标准的previousSibling,nextSibling,firstChild,lastChild,parentNode遍历方法有浏览器不兼容问题。我上面的解决方案是去掉遍历元素的相关空的#Text节点,是一个好的解决方案,但是使用起来不方便,我们何不自己写一些遍历节点的方法来代替标准的的previousSibling,nextSibling,firstChild,lastChild,parentNode。
我们的思路是利用元素是nodeType属性来判断元素是节点类型中那种节点类型,在DOM节点中我最常用的是元素节点,文本节点,属性节点,对应的类型值是元素节点nodeType=1 or ELEMENT_NODE, 文本节点 nodeType=2 or ATTRIBUTE_NODE,属性节点 nodeType=3 or TEXT_NODE,但是IE中并不支持命名常量,那就用数值吧,再配合标准的遍历属性。完全可以自己生产一些辅助函数来取代标准的遍历方式。以下一系列的辅助函数可以帮助您,他们能取代标准的previousSibling,nextSibling,firstChild,lastChild,parentNode;
原文链接:http://cssrainbow.cn/tutorials/javascript/565.html
【编辑推荐】
当前标题:JavaScriptDOM文档遍历实战
标题来源:http://www.shufengxianlan.com/qtweb/news26/246076.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联