JS与jQuery获取节点兄弟、父级、子级元素的方法对比

作者:小圆点

时间:2026-10-27

浏览:632

本文详细对比了原生JavaScript与jQuery在获取DOM节点父级、子级及兄弟节点时的差异。重点解析了Firefox等浏览器将换行符视为文本节点导致的长度统计错误,并提供清理空白节点的解决方案。同时列举了jQuery中parent、children、prev、next等核心查找方法及其过滤用法,帮助开发者实现跨浏览器兼容的节点遍历。

文章目录

原生JS与jQuery获取节点差异概述

首先介绍原生JavaScript的获取方式,其复杂程度远高于JQUERY,后续将通过JQUERY的方法进行对比说明。

原生JS方法相对繁琐,主要原因在于Firefox等浏览器会将HTML中的换行符也识别为DOM元素。

具体实现代码如下:

<div id="test">
<div></div>
<div></div>
</div>

若要获取原生JS中ID为test元素下的子元素,可以使用以下代码:

var a = document.getElementById("test").getElementsByTagName("div"); 这样操作没有问题。

此时变量a的长度length为2。

但如果换用另一种获取方式:

var b = document.getElementById("test").childNodes;

在IE浏览器中,变量b的长度length依然等于2,但在Firefox浏览器中长度却变为4,这是因为Firefox将换行符也当作了元素节点。

因此,我们需要对结果进行处理,遍历这些元素,删除类型为空格且内容为文本的节点。

处理Firefox空白节点问题

处理函数代码如下:

function del_ff(elem){
var elem_child = elem.childNodes;
for(var i=0; i<elem_child.length;i++){
if(elem_child[i].nodeName == "#text" && !/\s/.test(elem_child.nodeValue))
{elem.removeChild(elem_child[i]);
}
}
}

上述函数用于遍历子元素,当检测到节点类型是文本且该文本节点的值为空(即纯空白字符)时,将其删除。

nodeName属性用于获取节点的名称类型,/\s/是JS中正则表达式用于匹配非空字符,前面的感叹号!表示匹配空字符(即空白符)。

test()方法用于检测一个字符串是否匹配某个正则表达式的模式,其语法为:RegExpObject.test(string)。

如果字符串string中含有与RegExpObject匹配的文本,则返回true,否则返回false。

nodeValue属性用于获取节点内的值。

removeChild方法用于删除元素的子节点。

之后,在调用子节点、父节点、兄弟节点等属性之前,先调用上述函数清理掉空白节点即可。

完整的节点获取示例代码

完整示例代码如下:

<div id="test">
<div></div>
<div></div>
</div>
<script>
function dom() {
var s= document.getElementById("test");
del_ff(s); //清理空格节点
var chils= s.childNodes; //得到s的全部子节点
var par=s.parentNode; //得到s的父节点
var ns=s.nextSibling; //获得s的下一个兄弟节点
var ps=s.previousSibling; //得到s的上一个兄弟节点
var fc=s.firstChild; //获得s的第一个子节点
var lc=s.lastChild; //获得s的最后一个子节点
}
</script>

jQuery节点查找方法详解

下面介绍jQuery中关于父节点、子节点和兄弟节点的查找方法:

jQuery.parent(expr)用于查找父亲节点,可以传入expr进行过滤,例如$("span").parent()或$("span").parent(".class")。

jQuery.parents(expr)类似于parent(),但会查找所有祖先元素,不限于直接父元素。

jQuery.children(expr)返回所有直接子节点,该方法只返回直接的孩子节点,不会返回所有的子孙节点。

jQuery.contents()返回内部所有内容,包括节点和文本。

与children()的区别在于,contents()会将空白文本也作为一个jQuery对象返回,而children()只返回节点。

jQuery.prev()返回上一个兄弟节点,仅指紧邻的前一个,不是所有前面的兄弟节点。

jQuery.prevAll()返回所有之前的兄弟节点。

jQuery.next()返回下一个兄弟节点,仅指紧邻的后一个,不是所有后面的兄弟节点。

jQuery.nextAll()返回所有之后的兄弟节点。

jQuery.siblings()返回所有兄弟姐妹节点,不分前后顺序。

jQuery.find(expr)与jQuery.filter(expr)完全不同。jQuery.filter()是从初始的jQuery对象集合中筛选出一部分,而jQuery.find()的返回结果不包含初始集合中的内容,例如$("p").find("span")是从<p>元素开始查找<span>,等同于$("p span")。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章