javascript中的insertBefore和appendChild以及insertAfter(DOM中是没有提供的)

一、Node.insertBefore()
    Node.insertBefore()方法在参考节点之前插入一个拥有指定父节点的子节点,如果给定的子节点是对文档中现有节点的引用,insertBefore()会将其从当前位置移动到新位置(在将节点附加到其他节点之间,不需要从其父节点删除该节点)。
    意味着一个节点不能同时位于文档的两个点中,因此,如果节点已经有各节点,则首先删除该节点,然后将其插入到新位置。在将节点最佳到新父节点之前,可以使用Node.cloneNode()复制节点。(cloneNode()创建的节点副本不会自动与原始节点保持同步)
    如果引用节点为null,则将指定的节点添加到指定父节点的子节点列表的末尾
    如果给定分子节为DocumentFragment(文档片段),那么DocumentFragment的全部内容将被移动到指定父节点的子节点列表中。
语法:

var insertedNode = parentNode.insertBefore(newNode, referenceNode);
/*
insertedNode 已经经过插入newNode的新的节点
parentNode 新插入节点的父节点
newNode 用于插入的节点
referenceNode newNode 将要插在这个节点之前
另:如果 referenceNode 为 null 则 newNode 将被插入到子节点的末尾
*/

示例:

<div id="parentElement">
  <span id="childElement">foo bar</span>
</div>

<script>
//创建一个新的、普通的<span>元素
var sp1 = document.createElement("span");

//插入节点之前,要获得节点的引用
var sp2 = document.getElementById("childElement");
//获得父节点的引用
var parentDiv = sp2.parentNode;

//在DOM中在sp2之前插入一个新元素
parentDiv.insertBefore(sp1, sp2);
</script>

二、Node.appendChild()
    Node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾
语法:

var child = node.appendChild(child);
/*
node 是要插入子节点的父节点.
child 即是参数又是这个方法的返回值.
*/

示例:

// 创建一个新的段落p元素,然后添加到body的最尾部
var p = document.createElement("p");
document.body.appendChild(p);

    如果被插入节点已经存在于当前文档的文档树中,则那个节点会首先从原先的节点的位置移除,然后再插入到新的位置,不会被复制;代码理解如下:

<div id="father">
    <div id="son">123</div>
    <div>我是对比内容</div>
</div>

<script type="text/javascript">
    var father = document.getElementById("father");
    var son = document.getElementById('son');
    father.appendChild(son);

    // 上面这段代码中如果把js代码注释,效果是"123"在"我是对比内容"上面。
    // 如果不注释,"123"会在"我是对比内容"下面。
    // 这就说明id为son的这个节点直接被拿到了father的最后一个子节点的后面,而它本身就不存在了,相似的操作方法还有insertBefore()。
</script>

    如果需要保留这个子节点在原先位置显示,则需要先用Node.cloneNode方法复制出一个节点的副本,然后再插入到新位置

var son = document.getElementById('son').cloneNode();  //在上列代码使用cloneNode()复制一个再插入

三、insertAfter()
DOM 中是没有提供insertAfter方法的,可以通过insertBefore方法实现;
代码实现如下:

 /*
        * targetNode  是需要创建的目标节点
        * afterNode   是需要插入的坐标节点
    */
    Element.prototype.insertAfter = function (targetNode, afterNode) {
        //获取指定节点的下一个节点
        var beforeNode = afterNode.nextElementSibling;
        if (beforeNode == null) { 
            //如果为空,则直接添加到后面
            this.appendChild(targetNode);
        } else {
            //如果不为空,执行insertBefore
            this.insertBefore(targetNode, beforeNode)
        }
    }
    var div = document.getElementsByTagName('div')[0];  //获取到需要插入的最大父节点

    var span = document.getElementsByTagName('span')[0]; // 获取指定插入的位置span

    var b = document.getElementsByTagName('b')[0]; // 获取指定插入的位置b

    var p = document.createElement('p')  //创建p节点,以供插入创建

    // div.insertAfter(p,span)
    // div.insertAfter(p,b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值