JavaScript快速查找节点
我们在实际的开发中,经常要获取页面中某个html元素,动态更新元素的样式、内容属性等。

我们已经知道在JavaScript中提供下面的方法获取子、父、兄节点的方法:
常规
通过父节点获取子节点:
- parentObj.firstChild 获取已知父节点的第一个子节点
- parentObj.lastChild 获取已知父节点的最后一个子节点
- parentObj.childNodes 获取已知父节点的子节点数组(这里我在IE 7中获取的是所有直接的子节点)
- parentObj.children 获取已知节点的直接子节点数组(在IE7中和childNodes效果一样)
- parentObj.getElementsByTagName(tagName) 返回已知子节点中类型为指定值的子节点数组
通过临近节点获取兄弟节点:
- neighbourNode.previousSibing 获取已知节点的前一个兄弟节点
- neighbourNode.nextSibing 获取已知节点的下一个兄弟节点
通过子节点获取父节点:
1、childNode.parentNode 获取已知节点的父节点
上面的方法基本都是可以递归是使用的,parentObj.firstChild.firstChild.firstChild...但是这样的代码有一种傻傻的赶脚。。
扩展
在扩展之前,我们需要知道一些关于节点基础的知识:Dom节点中,每个节点都拥有不同的类型
W3C规范中常用的Dom节点的类型有以下几种
| 节点类型 | 说明 | 值 |
| 元素节点 | 每一个HTML标签都是一个元素节点 | 1 |
| 属性节点 | 元素节点(HTML标签)的属性,如id,class,name等 | 2 |
| 文本节点 | 元素节点或属性节点中的文本内容 | 3 |
| 注释节点 | 便是文档的注释,形式如<!--comment Text--> | 8 |
| 文档节点 | 表示整个文档(Dom树的根节点,即document) | 9 |
关于节点的名称,不同类型的节点对应不同的名称
| 节点类型 | 节点名称 |
| 元素节点 | HTML的名称(大写) |
| 属性节点 | 属性的名称 |
| 文本节点 | 它的值永远的都#text |
| 文档节点 | 它的值永远都是#document |
可以分别通过nodeType(节点类型),nodeName(节点名称),以及nodeValue(节点值)分别返回节点的类型(比如元素节点返回1,属性节点返回2)、节点名称以及节点值;
JS获取兄弟节点的两种方法
方法一:通过父元素的子元素先找到含自己在内的“兄弟元素”,然后在剔除自己
function sibling(elem){
var a = [];
var b = elem.parentNode.children;
for (var i = 0 ; i < b.length ; i++){
if(b[i] !== elem) a.push(b[i]);
}
return a;
}
方法二:jQuery中实现方法,先通过查找元素的第一个子元素,然后在不断往下找下一个紧邻元素,判断并剔除自己。
siblings:function(elem)
{
return JQuery.sibling(elem.parentNode.firstNode,elem);
} JQuery.sibling = function(n,elem){
var r = [];
for (;n;n= n.nextSibling){
if(n.nodeType == 1 && (!elem || elem != elem))
r.push(n);
}
return r;
}
在jQuery 1.2多的版本中都可以找到这段代码,我看的jQuery1.2.3的版本,在1800行可以找到这段代码:

把这个方法转化为独立可用的函数:
fucntion sibling(elem){
var r = [];
var n = elem.parentNode.firstChild;
for(;n;n = n.nextSibling) {
if(n.nodeType === 1 && n !== elem) {
r.push(n);
}
}
return r;
}
很显然通过这种方法查找特定节点的兄弟元素,可以很方便的避免的使用递归的冗余。
获取所有元素子节点
在JavaScript中,可以通过children来获取所有的子节点(只返回HTML中,甚至不返回子节点),几乎得到了所有浏览器的支持,但是在Firefox有的版本中不支持。
注意:在IE中,children包含注释节点
所以因为特殊情况的存在,有时候我们需要只获取元素节点,这样我们就可以通过nodeType属性来进行筛选,用上面的知识:nodeType == 1的节点为元素节点。
下面,自定义一个函数来获取所有的元素子节点:
var getChildNodes = function(elem) {
var childArr = elem.children || elem.childNodes,
childArrTem = new Array();
for (var i = 0 ; i < childArr.length; i ++ ) {
if (childArr[i].nodeType == 1){
childArrTem.push(childArr[i]);
}
}
return childArrTem;
}
获取所有的父节点
同样的,我们可以获取当前节点所有的父节点:
function getParents (elem){
var parents = [];
while(elem.parentNode){
parents.push(elem.parentNode)
elem = elem.parentNode;
}
return parents;
}
这样我们可以接受一个dom节点,最终会获取到document对象,如果只要获取到最上层是body,可以把while里的判断改为: while(elem.parentNode && elem.parentNode.tagName == 'BODY'
依据JavaScript中的提供的获取节点的方法和相关的知识,我们可以写出很多封装的方法,尝试一下,你可以写出多少种获取节点的方法呢?
当我们写出了一些操作节点的封装之后在去看jQuery中Dom操作节点方法的源码会轻松很多呢。
JavaScript快速查找节点的更多相关文章
- jQuery实现的快速查找
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- (一)DOM 常用操作 —— “查找”节点
在 DOM 树中,如果想要操作一个节点,那么首先要"查找"到这个节点.查找节点的方法由 Document 接口定义,而该接口由 JavaScript 中的 document 对象实 ...
- JavaScript Dom 查找
JavaScript Dom 查找 一.直接查找 获取单个元素 document.getElementById('i1') 获取多个元素(列表数组) document.getElementsByTag ...
- JavaScript的DOM_节点的增删改
一.概述 DOM 不单单可以查找节点,也可以创建节点.复制节点.插入节点.删除节点和替换节点. 二.write()方法 write()方法可以把任意字符串插入到文档中去.会覆盖掉原来的html &l ...
- javascript快速入门8--值,类型与类型转换
原始值和引用值 在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值. 原始值(primitive value)是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量 ...
- 前端JavaScript之DOM节点操作
1.HTML DOM是啥 Document Object Model:定义了访问和操作HTML文档的标准方法,把HTML文档呈现为带有元素,属性和文本的树状结构 2.解析过程 HTML加载完毕,渲染引 ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- DOM操作 ——如何添加、移除、移动、复制、创建和查找节点等。
DOM操作 --如何添加.移除.移动.复制.创建和查找节点等. (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个 ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
随机推荐
- 关于Matlab里面的四个取整(舍入)函数:Floor, Ceil, Fix, Round的解释(转)
转自http://blog.sina.com.cn/s/blog_48ebd4fb010009c2.html floor:朝负无穷方向舍入 B = floor(A) rounds the elem ...
- 长距离单历元非差GNSS网络RTK理论与方法总结(未完)
2018-11-04 1.状态空间: 状态空间是控制工程中的一个名词.状态是指在系统中可决定系统状态.最小数目变量的有序集合. 而所谓状态空间则是指该系统全部可能状态的集合.简单来说,状态空间可以 ...
- Linux新建用户没有设置密码
只要你能登陆root账户就行 登陆root账户 输入 echo "密码“ | passwd --stdin 用户名
- Matlab面向对象编程基础
DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...
- echarts问题
1.鼠标经过折线图 显示的框中的文字设置,需要设置tooltip下的formatter属性 formatter属性值可以为字符串也可function formatter:function(data) ...
- python第十八课——常用内置函数
常用内置函数:round(): print(round(3.14),round(3.99)) print(round(3145.926,-2),round(413.575,2)) abs(): pri ...
- 鲜为人知的 Python 语法
所有人(好吧,不是所有人)都知道 python 是一门用途广泛.易读.而且容易入门的编程语言. 但同时 python 语法也允许我们做一些很奇怪的事情. 使用 lambda 表达式重写多行函数 ...
- Python读文件报错:SyntaxError: Non-ASCII character in file
打开city.py文件时报错 问题原因: 程序中的编码错误,python默认是acii模式,没有支持utf8.如果代码中有汉字 ,就会报错 解决方案: 源代码文件(city.py)第一行添加:#cod ...
- php后台+前端开发过程整理
一.PHP后台从数据库中获取数据 1. 建立数据库连接: //在本项目中封装了数据库的各种操作 $dbConn = $this->_createMysqlConn(); 2. 执行sql语句 $ ...
- C++ pair(对组)的简单了解
类模板:template<class T1,class T2> struct pair 参数:T1是第一个值得数据类型,T2是第二个值的数据类型. 功能:pair将一对值组合成一个值, 这 ...