了解js的节点操作,父级节点和子级节点,兄级节点

利用dom树可以把节点划分为不同的层级关系 常见的是父子兄层级节点

父级节点(重点掌握!)

node.parentNode

  • node 节点
  • parentNode属性可返回某节点的父节点 但是是返回最近的一个父节点
  • 如果指定的节点没有父节点 则返回null

案例:打印sun的父节点

<body>
    <div class="demo">
        <div class="box">
            <div class="sun"></div>
        </div>
    </div>

</body>
<script>
    var sun = document.querySelector('.sun')
    console.log(sun.parentNode);
</script>

子级节点(重点掌握!)

parentNode.children

是一个只读属性 返回所有子元素的节点,只返回子元素节点,其余节点不返回

案例:返回ul里的小li

<body>
        <ul>
            <li>dddd</li>
            <li>dddd</li>
            <li>dddd</li>
        </ul>
</body>
<script>
    var ul = document.querySelector('ul');
    console.log(ul.children);
</script>

 如果不想要全部的节点,只返回元素的某一个节点,可以这样操作parentNode.children[索引号]

索引号从0开始

案例1: 此时这时打印的就是第一个li  dddd1

获取最后一个子节点可以写索引号 也可以让长度减1  这个好处在于 如果后期增加li 但是js里的内容不用改变 不用更改索引号

<body>
        <ul>
            <li>dddd1</li>
            <li>dddd2</li>
            <li>dddd3</li>
        </ul>
</body>
<script>
    var ul = document.querySelector('ul');
    //返回全部li子节点
    console.log(ul.children);
    //返回第一个li子节点
    console.log(ul.children[0]);
    //返回最后一个li子节点
    console.log(ul.children[ul.children.length - 1 ]);
</script>

兄弟节点

nextElementSibling 返回当前元素的下一个元素节点 找不到返回null

previousElementSibling 返回当前元素的下上一个元素节点 找不到返回null

这两个具备兼容性问题 ie9才支持

<body>
    <div>boxs</div>
    <span>span</span>
    <script>
        var div = document.querySelector('div');
        var span = document.querySelector('span');
        console.log(div.nextElementSibling); //返回当前元素的下一个元素节点 即span
        console.log(span.previousElementSibling); //返回当前元素的上一个元素节点 即div
    </script>
</body>

关于nextElementSibling 在代码中的使用 可以看这篇笔记:使用js实现简单版用户登录表单验证(结合正则表达式

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
点击父级子级展开,或者收起 <script type=text/javascript><!-- var LastLeftID = ""; function menuFix() { var obj = document.getElementById("nav").getElementsByTagName("li"); for (var i=0; i<obj.length; i++) { obj[i].onmouseover=function() { this.className+=(this.className.length>0? " ": "") + "sfhover"; } obj[i].onMouseDown=function() { this.className+=(this.className.length>0? " ": "") + "sfhover"; } obj[i].onMouseUp=function() { this.className+=(this.className.length>0? " ": "") + "sfhover"; } obj[i].onmouseout=function() { this.className=this.className.replace(new RegExp("( ?|^)sfhover\\b"), ""); } } } function DoMenu(emid) { var obj = document.getElementById(emid); obj.className = (obj.className.toLowerCase() == "expanded"?"collapsed":"expanded"); if((LastLeftID!="")&&(emid!=LastLeftID)) //关闭上一个Menu { document.getElementById(LastLeftID).className = "collapsed"; } LastLeftID = emid; } function GetMenuID() { var MenuID=""; var _paramStr = new String(window.location.href); var _sharpPos = _paramStr.indexOf("#"); if (_sharpPos >= 0 && _sharpPos < _paramStr.length - 1) { _paramStr = _paramStr.substring(_sharpPos + 1, _paramStr.length); } else { _paramStr = ""; } if (_paramStr.length > 0) { var _paramArr = _paramStr.split("&"); if (_paramArr.length>0) { var _paramKeyVal = _paramArr[0].split("="); if (_paramKeyVal.length>0) { MenuID = _paramKeyVal[1]; } } /* if (_paramArr.length>0) { var _arr = new Array(_paramArr.length); } //取所有#后面的,菜单只需用到Menu //for (var i = 0; i < _paramArr.length; i++) { var _paramKeyVal = _paramArr[i].split('='); if (_paramKeyVal.length>0) { _arr[_paramKeyVal[0]] = _paramKeyVal[1]; } } */ } if(MenuID!="") { DoMenu(MenuID) } } GetMenuID(); //*这两个function的顺序要注意一下,不然在Firefox里GetMenuID()不起效果 menuFix(); --></script>
如果我们有一个父级数组对象和一个子级数组对象,同样可以使用类似的方法将它们组成父子级结构。我们可以先将父级数组对象和子级数组对象中的每个元素都放入 Map 中,并将它们的 id 作为 Map 的键,然后使用一个循环遍历子级数组对象,每次取出一个子级元素对象,找到它在 Map 中对应的父级元素对象,并将该子级元素对象添加到父级元素对象的子节点列表中。 以下是一个简单的 Java 代码实现: ``` public static List<TreeNode> buildTree(List<Parent> parents, List<Child> children) { Map<Integer, TreeNode> map = new HashMap<>(); // 将父级数组对象和子级数组对象中的每个元素都放入 Map 中 for (Parent parent : parents) { map.put(parent.getId(), new TreeNode(parent.getId(), parent.getName())); } for (Child child : children) { map.put(child.getId(), new TreeNode(child.getId(), child.getName())); } // 遍历子级数组对象,将子级元素对象添加到对应的父级元素对象的子节点列表中 for (Child child : children) { int parentId = child.getParentId(); TreeNode parentNode = map.get(parentId); TreeNode childNode = map.get(child.getId()); parentNode.addChild(childNode); } // 找到根节点 List<TreeNode> roots = new ArrayList<>(); for (TreeNode node : map.values()) { if (node.getParent() == null) { roots.add(node); } } return roots; } ``` 其中,Parent 和 Child 是父级数组对象和子级数组对象的类,包含 id 和 name 两个属性。 ``` public class Parent { private int id; private String name; public Parent(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Child { private int id; private String name; private int parentId; public Child(int id, String name, int parentId) { this.id = id; this.name = name; this.parentId = parentId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getParentId() { return parentId; } public void setParentId(int parentId) { this.parentId = parentId; } } ``` 这个函数的输入是一个父级数组对象和一个子级数组对象,输出是一个树形结构,每个节点包含一个 id、name 和它的子节点列表。如果一个节点没有父节点,它就是根节点

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值