zoukankan      html  css  js  c++  java
  • DOM 操作 2

    题目

    从一道面试题说起,给定下面的 html,如何把该 html 中 DOM 的 Children 逆序。

    <div id="a">
      <span>1</span>
      <p>2</p>
      <a>3</a>
      <div>4</div>
    </div>
    

    解答一

    该方法比较原始笨重,但是可以实现功能。思路大概就是获取 children,然后把 children 保存成数组,同时把 children 从 DOM 树中删除,对数组逆序以后,再挂载到原来的 DOM 树里面。

    非常中规中矩的一种写法,这种写法非常的稳妥。

    但是看到这种答案,基本就是不懂 DOM树的操作。

    <script>
      let element = document.getElementById('a');
      function reverseChildren() {
        let children = Array.prototype.slice.call(element.childNodes);
        for(let child of children) {
          element.removeChild(child);
        }
        // element.innerHTML = '';
        children.reverse();
        for(let child of children) {
          element.appendChild(child);
        }
      }
      reverseChildren();
    </script>
    

    解答二

    熟悉 DOM 操作的,知道我们对原来的 children 的 child 进行 append 操作时候,child 会自动从 html 的 dom 树中剖离,所以:

    <script>
      let element = document.getElementById("a");
      function reverseChildren() {
        let l = element.childNodes.length;
        while(l-- > 0) {
          // 始终找最后一个元素
          element.appendChild(element.childNodes[l]);
        }
      }
      reverseChildren();
    </script>
    

    解答三 (两分的答案)

    使用 range

    <script>
      let element = document.getElementById("a");
      function reverseChildren() {
        let range = new Range();
        range.selectNodeContents(element);
        // extractContents可以一下子把所有的子元素都摘下来
        let fragment = range.extractContents();
        var l = fragment.childNodes.length;
        while (l-- > 0) {
          fragment.appendChild(fragment.childNodes[l]);
        }
        element.appendChild(fragment);
      }
      reverseChildren();
    </script>
    
  • 相关阅读:
    MyBatis---集合查询(一对多)
    MyBatis---简单关系查询
    MyBatis---简介
    MyBatis---简单增删改查的带事物的例子
    log4j.properties配置文件详解
    Hibernate---实体类注释简介
    Hibernate---数据操作示例BY实体类注释
    Hibernate---数据操作示例BY实体映射文件
    JDBC---java与数据库中数据类型的对应关系
    Hibernate---session
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13277675.html
Copyright © 2011-2022 走看看