操作DOM对象(重点)

操作DOM对象(重点)

  • 由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM。

  • 获得DOM

    • 第一种方法

      // 返回ID为'test'的节点:
      var test = document.getElementById('test');
      // 先定位ID为'test-table'的节点,再返回其内部所有tr节点: 
      var trs = document.getElementById('test-table').getElementsByTagName('tr');
      // 先定位ID为'test-div'的节点,再返回其内部所有class包含red的节点: 
      var reds = document.getElementById('test- div').getElementsByClassName('red');
      // 获取节点test下的所有直属子节点: 
      var cs = test.children;
      // 获取节点test下第一个、最后一个子节点:
      var first = test.firstElementChild;
      var last = test.lastElementChild;
      
    • 第二种方法

      // 通过querySelector获取ID为q1的节点:
      var q1 = document.querySelector('#q1');
      // 通过querySelectorAll获取q1节点内的符合条件的所有节点: 
      var ps = q1.querySelectorAll('div.highlighted > p');
      
  • 更新DOM

    //修改文本一: innerHTML 属性
    // 获取<p id="p-id">...</p>
    var p = document.getElementById('p-id');
    // 设置文本为abc:
    p.innerText = 'ABC'; // <p id="p-id">ABC</p>
    // 设置HTML:
    p.innerHTML = 'ABC <span style="color:red">RED</span> XYZ'; // <p>...</p>的内部结构已修改
    p.style.color='red'; //修改样式,属性使用字符串包裹
    
    • 修改CSS:DOM节点的 style 属性对应所有的CSS,可以直接获取或设置。

      /*因为CSS允许 font-size 这样的名称,但它并非JavaScript有效的属性名,所以需要在JavaScript中改写为
      驼峰式命名 fontSize */
      // 获取<p id="p-id">...</p> 
      var p = document.getElementById('p-id');
      // 设置CSS:
      p.style.color = '#ff0000';
      p.style.fontSize = '20px';
      p.style.paddingTop = '2em';
      
  • 删除DOM

    要删除一个节点,首先要获得该节点本身以及它的父节点,然后,调用父节点的 removeChild 把自己删掉

    // 拿到待删除节点:
    var self = document.getElementById('myself');
    // 拿到父节点:
    var parent = self.parentElement;
    // 删除:
    var removed = parent.removeChild(self);
    removed === self; // true
    

    var parent=document.getElementById('parent');
    parent.removeChild(parent.children[0]);
    parent.removeChild(parent.children[1]);     //<--浏览器报错
    /*浏览器报错: parent.children[1] 不是一个有效的节点。
    原因就在于,当 First 节点被删除后, parent.children 的节点数量已经从2变为了1,索引 [1] 已经不存在了。
    因此,删除多个节点时,要注意 children 属性时刻都在变化*/
    
  • 插入DOM

    • innerHTML 会直接替换掉原来的所有子节点。如果这个DOM节点是空的,则可以使用

    • appendChild ,把一个子节点添加到父节点的最后一个子节点。

      <!-- HTML结构 -->
      <p id="js">JavaScript</p>
      <div id="list">
          <p id="java">Java</p>
          <p id="python">Python</p>
          <p id="scheme">Scheme</p>
      </div>
      
      <script>
          //把 JavaScript 添加到的最后一项
          var js = document.getElementById('js'), //获得将要插入的节点
              list = document.getElementById('list'); //获得父节点
          list.appendChild(js);//父节点.appendChild(需插入结点)
      </script>
      
      //<!-- 插入结果-->
      <div id="list"> 
          <p id="java">Java</p>
          <p id="python">Python</p> 
          <p id="scheme">Scheme</p> 
          <p id="js">JavaScript</p>
      </div>
      
      //创建一个标签节点(通过这个属性,可以设置任意的值)
      var newP = document.createElement('p');
      newP.id = 'newP';
      newP.innerText = 'hello';
      list.appendChild(newP);
      
      //创建一个标签节点(通过这个属性,可以设置任意的值)
      var newScript = document.createElement('script');
      newScript.setAttribute('type','text/javascript');
      list.appendChild(newScript);
      
    • insertBefore,把一个子节点添加到指定节点之前

      //子节点会插入到referenceElement 之前。
      parentElement.insertBefore(newElement, referenceElement);
      
posted @ 2021-05-12 14:12  saxon宋  阅读(61)  评论(0)    收藏  举报