jQuery获取父级元素、子级元素、兄弟元素方法汇总
在项目开发过程中,在对元素进行样式控制时应用到的方法如下:
function showOthers(obj){
// 通过jquery方式获取元素值
var type = $(obj).attr('_value');
if($(obj).is(':checked')){//选中
$(obj).parent().parent().siblings().children().children("#"+type+"div").show();
$(obj).parent().parent().siblings().children().children("#"+type+"div").children().attr("require","true");
}else{
/* java端处理需注意 首先校验是否勾选,若勾选才取值 */
$(obj).parent().parent().siblings().children().children("#"+type+"div").hide();
$(obj).parent().parent().siblings().children().children("#"+type+"div").children().removeAttr("require");
}
}
其中,
-
jQuery.parent(expr)
找父亲节点,可以传入expr进行过滤,比如$("span").parent()
或者$("span").parent(".class")
; -
jQuery.parents(expr)
,类似于jQuery.parents(expr)
,但是是查找所有祖先元素,不限于父元素; -
jQuery.children(expr)
.返回所有子节点,这个方法只会返回直接的孩子节点,不会返回所有的子孙节点; -
jQuery.contents()
,返回下面的所有内容,包括节点和文本。这个方法和children()的区别就在于,包括空白文本,也会被作为一个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元素开始找,等同于$("p span")
;
那么在js
中又是如何实现的呢?下面讲解下javascript
中的nextSibling
和previousSibling
使用注意事项。
JavaScript
中的nextSibling
和previousSibling
和作用类似于jquery
的next()
和prev()
,都是获取下一个/上一个同胞元素,如果下一个同级节点不存在,则此属性返回值是null
。但是具体的使用中还是有差异的,如果稍不注意,就会引起错误。
html
结构中的各种空格,换行符都可能会把文本节点当做同胞元素处理。这就会导致错误。
例如下面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
window.onload = function() {
var nextType = document.getElementById('one').nextSibling;
alert(nextType.nodeType);
}
</script>
</head>
<body>
<div id="div">
<p id = "one">我是p</p>
<span id="two">我是span</span>
</div>
</body>
</html>
在上面这段代码中,获取了id为"one"的元素并用nextSibling
获取了他的下一个同胞元素。赋值给了变量nextType
。
var nextType = document.getElementById('one').nextSibling;
并使用 alert(nextType.nodeType);
弹出他的节点类型,如果按常理,元素p下一个相邻的同胞元素为是span
,弹出的数字应该为“1”,但我在火狐,谷歌,IE浏览器(网上说只有火狐才会把换行,空格当做文本节点处理,但是我测试谷歌,IE浏览器效果都是一样的,这有点不解)打开后,弹出的数字是3,也就是文本节点。这是因为换行符被当做文本节点来处理,成为了p元素的下一个同胞元素。
如果我要获取span
的文本值,需要这样写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
window.onload = function() {
var nextType = document.getElementById('one').nextSibling;
var span = nextType.nextSibling;
alert(span.lastChild.nodeValue);
}
</script>
</head>
<body>
<div id="div">
<p id = "one">我是p</p>
<span id="two">我是span</span>
</div>
</body>
</html>
p和span标签中间隔着文本节点,需要连续使用2次nextSibling才能选中span标签取得文本值。
注意⚠️:firstChild,lastChild,nextSibling,previousSibling
都会将空格或者换行当做节点处理,但是有代替属性。所以为了准确地找到相应的元素,会用firstElementChild
,lastElementChild
,nextElementSibling
,previousElementSibling
兼容的写法,这是JavaScript
自带的属性。
但坏消息是IE6,7,8不兼容这些属性。IE9以上和火狐谷歌支持。可参考下面的方法过滤文本节点获取正确的下一个元素节点。
function getNextElement(element){
var e = element.nextSibling;
if(e == null){//测试同胞节点是否存在,否则返回空
return null;
}
if(e.nodeType==3){//如果同胞元素为文本节点
var two = getNextElement(e);
if(two.nodeType == 1)
return two;
}else{
if(e.nodeType == 1){//确认节点为元素节点才返回
return e;
}else{
return false;
}
}
}
附:HTML DOM nodeType 属性
返回body元素的节点类型:
nodeType
属性返回节点类型。
- 如果节点是一个元素节点,nodeType 属性返回 1。
- 如果节点是属性节点, nodeType 属性返回 2。
- 如果节点是一个文本节点,nodeType 属性返回 3。
- 如果节点是一个注释节点,nodeType 属性返回 8。
该属性是只读的。
- 点赞
- 收藏
- 关注作者
评论(0)