• DOM 操作


    要知道一点,所有的 DOM 元素,都只能有一个父元素,它不能被两次插入到DOM 树中

    如果我们把一个 DOM 节点插入到 document 的 a 位置,然后又把 DOM 节点插入到 document 的 b 位置,那么,它会默认把 a 位置的 DOM 节点 remove,再插入到 b 位置。

    我们操作 DOM 的时候,是不需要把它从 DOM 树上面摘下来的,只要把它挂到另外一个地方,它会自动被摘下来,哪怕两棵树都不相关。

    DOM 导航类操作

    Node 版本(推荐根据 Node 来操作)

    • parentNode
    • childNodes
    • firstChild
    • lastChild
    • nextSibling
    • previousSibling

    Element 版本

    • parentNode
    • child
    • firstElementChild
    • lastElementChild
    • nextElementSibling
    • previousSibling

    DOM 修改类操作

    所有的修改类操作,都会实时改变child 的值

    • appendChild 从后面插入
    • insertBefore 从指定位置插入,有两个参数,一个是插入的元素,一个是插入的位置(有个问题就是,插入不到最后面,所以有了 appendChild)
    • removeChild
    • replaceChild

    高级操作

    尽量记住

    • compareDocumentPosition 用于比较两个节点的关系

      用于比较先后

    • contains 检查一个节点是否包含另外一个节点

    • isEqualNode 检查两个节点是否完全相同

    • isSameNode 检查两个节点是否是同一个节点,实际上在 javascript 中可以使用“===”

      这个就没啥用,用 javascript 就完事了

    • cloneNode 复制一个节点,如果传入参数true,则会对该元素做深拷贝

    eg

    <div id="x">
      <div>1</div>
      <div>2</div>
    </div>
    <div id="b">
    </div>
    
    // 执行下面的这段代码,我们会发现,上面的 DOM 树里 x 的 <div>2</div>没了,到了 id="b"的 div 里
    document.getElementById("b").appendChild(document.getElementById("x").children[1])
    
    // children: HTMLCollection (div)
    var children = document.getElementById('x').children[1];
    // 执行下面这个
    document.getElementById("b").appendChild(document.getElementById("x").children[1])
    // 我们会发现,children 打印出来变成空的了
    console.log(children)
    
    

    最常见吃的亏

    <div id="x">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      <div>5</div>
      <div>6</div>
    </div>
    <div id="b">
    </div>
    
    <script>
      var x = document.getElementById("x");
      var b = document.getElementById("b");
      for(var i = 0; i < x.children.length; i ++) {
    		b.appendChild(x.children[i]);
    	}
    </script>
    

    执行这段代码,我们会发现 DOM 树变成了这个样子。

    原因呢???因为这是一个 living 的collection,我们把原来的第一个挪过去的时候,第一个就没了,实际上取第二个的时候取到的就是第三个。然后同理取到了第五个。

    正确的写法

    <div id="x">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      <div>5</div>
      <div>6</div>
    </div>
    <div id="b">
    </div>
    
    <script>
      var x = document.getElementById("x");
      var b = document.getElementById("b");
    	while(x.children.length) {
        b.appendChild(x.children[1]);
      }
    </script>
    

    说说感受,学的越多,越发现自己需要懂的越多。

    学不动了。然而,还不是要学。

  • 相关阅读:
    LeetCode 404. 左叶子之和
    三年了
    LeetCode 543. 二叉树的直径
    求结点在二叉排序树中层次的算法
    LeetCode 98. 验证二叉搜索树
    LeetCode 236. 二叉树的最近公共祖先
    LeetCode 129. 求根到叶子节点数字之和
    LeetCode 113. 路径总和 II
    LeetCode 107. 二叉树的层次遍历 II
    LeetCode 144. 二叉树的前序遍历 (非递归)
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13272988.html
Copyright © 2020-2023  润新知