美文网首页
JS - 替换DOM节点

JS - 替换DOM节点

作者: Iceesong | 来源:发表于2018-08-20 20:36 被阅读0次

Demo

replaceChild

首相想到的就是 replaceChild 使用,MDN 定义如下

定义

用指定的节点替换当前节点的一个子节点,并返回被替换掉的节点。

语法
replacedNode = parentNode.replaceChild(newChild, oldChild);

cloneNode

有定义知道,replaceChild是可以用来替换 DOM 节点,但仅限于同一父元素(或已知单个节点),不能直接实现不同级间的dom替换,所以用cloneNode 克隆下节点,下逐一替换

  function changeDom(node1, node2) {
      // 深度复制 DOM 节点,在 replace 替换                
      let clone1 = node1.cloneNode(true)
      let clone2 = node2.cloneNode(true)

      node1.parentNode.replaceChild(clone2, node1)
      node2.parentNode.replaceChild(clone1, node2)
  }

运行

HTML 如下

  <div id="aa">div1
    <span id="aa1"> span1</span>
  </div>

  <div id="bb">div2
    <span id="bb1"> span2</span>
  </div>
  <div id="cc">
    ccc
  </div>

调用函数

     changeDom(a, b1)

完善逻辑

那如果要 aa1 互相替换呢,要知道他们是父子嵌套元素,本身逻辑就会出现错误,所以应提前判断并在运行时抛出错误

判断替换 DOM 节点是否为祖孙(嵌套)关系

  // 判断是否为子孙节点
  function isInherit(node1, node2) {
    while(node1.parentNode !== node2) {
      node1 = node1.parentNode
      if(node1.tagName == 'HTML') {
        return false
      }
    }
    return true
  }

在完善 changDom 函数

  function changeDom(node1, node2) {
    if (node1 == node2) {       
      // 剔除替换为自己的
      return new Error('Can\'t change to yourself!')
    } else if (isInherit(node1, node2) || isInherit(node2, node1)) {
      // 子孙关系不能替换
      return new Error('Can\'t change by inherit Elements!')
    } else {    
      // 深度复制 DOM 节点,在 replace 替换                
      let clone1 = node1.cloneNode(true)
      let clone2 = node2.cloneNode(true)

      node1.parentNode.replaceChild(clone2, node1)
      node2.parentNode.replaceChild(clone1, node2)
    }
  }

相关文章

  • 前端知识积累之——JS篇

    1 原生js的dom操作 创建节点 createElement 移除节点 removeChild 替换节点 rep...

  • JS - 替换DOM节点

    Demo replaceChild 首相想到的就是 replaceChild 使用,MDN 定义如下 定义 用指定...

  • DOM和BOM的基础知识

    目录 js组成 DOMDOM是什么DOM节点是什么查找DOM节点,查看DOM节点的属性和样式添加DOM节点删除DO...

  • jQuery基础(2)

    (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...

  • 2022-05-06

    JS 原生DOM 的操作 dom..setAttribute("class",classVal ); //替换c...

  • jQuery中的DOM节点操作

    查找节点(略) 创建节点 插入节点 包裹节点 删除节点 复制节点 替换节点 节点遍历(略) 操作dom节点属性 ...

  • 2018-04-08JQ中DOM的操作

    回顾原生DOM操作 *获取节点 *创建节点 *遍历节点 *替换节点 *删除节点 *插入节点 *复制节点 JQ中的...

  • jQuery基础-DOM篇

    jQuery对DOM的操作上,在原生的JS的基础上封装和简化出对节点的创建、删除、插入、替换和复制,还有jQuer...

  • JS双向数据绑定

    双向数据绑定简述 双向数据绑定,可以将JS对象的属性绑定到DOM节点上,实现JS对象跟DOM节点的同名属性的关联,...

  • vue-diff算法

    虚拟DOM(Virtual Dom),也就是我们常说的虚拟节点,是用JS对象来模拟真实DOM中的节点,该对象包含了...

网友评论

      本文标题:JS - 替换DOM节点

      本文链接:https://www.haomeiwen.com/subject/qpfriftx.html