JavaScript——通过DOM的replaceChild方法替换两个li节点

大家好,这里是前端寄术区博主PleaSure乐事,今天在学习DOM的时候发现有关通过replaceChild方法替换两个节点的代码,顺手记录,与大家分享。


初始代码

如果我们有以下一段代码,想要替换两个带有标签的li节点:

html 复制代码
<body>
    <p>喜欢的城市</p>
    <ul id="city">
        <li id="bj" name="beijing">北京</li>
        <li>上海</li>
        <li>广州</li>
        <li>深圳</li>
    </ul>
    <p>喜欢的语言</p>
    <ul id="language">
        <li id="js">javascript</li>
        <li>python</li>
        <li>c++</li>
        <li>java</li>
</body>

交换方法

交换

此时我们需要请出DOM当中的replaceChild方法。replaceChild方法的格式为:replaceChild(newNode,oldnode)。

此时我们需要先使用getElementId获取两个li标签,并通过replaceChild测试效果,代码及效果如下:

javascript 复制代码
    <script type = "text/javascript">
        window.onload = function(){
            var bjnode = document.getElementById("bj");
            var jsnode = document.getElementById("js");
            var citynode = document.getElementById("city");
            citynode.replaceChild(jsnode,bjnode);
        }
    </script>

这里我们会发现少了个节点,此时我们就需要一个中间变量。我们使用nodeclone对节点进行复制,使用两次relpace方法并完成最终的交换。

javascript 复制代码
<script type = "text/javascript">
    window.onload = function(){
        var bjnode = document.getElementById("bj");
        var jsnode = document.getElementById("js");
        var citynode = document.getElementById("city");
        //citynode.replaceChild(jsnode,bjnode);
        var languagenode = document.getElementById("language");
        //克隆bj节点
        var bjnode2 = bjnode.cloneNode(true);
        languagenode.replaceChild(bjnode2,jsnode);
        citynode.replaceChild(jsnode,bjnode);
    }
</script>

此时,我们就已经通过使用clone方法和replace方法完成节点的复制。

整合为函数方便调用

此时如果我们将刚刚的克隆+替换代码用函数进行整合,我们就可以在以后进行更加方便的调用,使得代码更加易读,增加可维护性:

javascript 复制代码
<script type = "text/javascript">
    window.onload = function(){
        var bjnode = document.getElementById("bj");
        var jsnode = document.getElementById("js");
        var citynode = document.getElementById("city");
        replaceNode(bjnode,jsnode);
    }
    function replaceNode(aNode,bNode){
        //获取两个节点的父节点
        var aParentNode = aNode.parentNode;
        var bParentNode = bNode.parentNode;
        if(aParentNode && bParentNode){
            //克隆其中一个节点
            var aNode2 = aNode.cloneNode(true);
            //使用replaceChild方法替换
            aParentNode.replaceChild(bNode,aNode);
            bParentNode.replaceChild(aNode2,bNode);
        }
    }
</script>

此时的效果与上方的一致,没有区别。需要注意的是,仅仅使用一次replaceNode只能完成单向替换,要实现双向替换则需要进行克隆后再进行互换。

相关推荐
x***13391 小时前
【MyBatisPlus】MyBatisPlus介绍与使用
android·前端·后端
z***75154 小时前
【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
android·前端·后端
必胜的思想钢印4 小时前
修改主频&睡眠模式&停机模式&待机模式
笔记·stm32·单片机·嵌入式硬件·学习
fruge5 小时前
仿写优秀组件:还原 Element Plus 的 Dialog 弹窗核心逻辑
前端
胡萝卜3.05 小时前
掌握C++ map:高效键值对操作指南
开发语言·数据结构·c++·人工智能·map
an86950015 小时前
vue新建项目
前端·javascript·vue.js
电子_咸鱼5 小时前
【STL string 全解析:接口详解、测试实战与模拟实现】
开发语言·c++·vscode·python·算法·leetcode
w***95496 小时前
SQL美化器:sql-beautify安装与配置完全指南
android·前端·后端
沐知全栈开发6 小时前
ionic 选项卡栏操作详解
开发语言
曹牧6 小时前
C#中,#region和#endregion
开发语言·c#