Js-WebApo-DOM节点操作

107 阅读3分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

DOM节点操作

节点简介

DOM节点

DOM树里每一个内容都称之为节点

节点类型

  1. 元素节点

    所有的标签 比如 body、 div

    html 是根节点

  1. 属性节点

    所有的属性 比如 href

  1. 文本节点

    所有的文本

  1. 其他

节点操作

查找父节点

parentNode :返回上一级的父节点,找不到返回null

//语法   子元素.parentNode;
<body>
  <div>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
  </div>
​
  <script>
    const li = document.querySelector('li');
    //parentNode 查找父节点
    console.log(li);  //li
    console.log(li.parentNode);   //ul
    console.log(li.parentNode.parentNode);   //div
    console.log(li.parentNode.parentNode.parentNode);   //body
    console.log(li.parentNode.parentNode.parentNode.parentNode); //html
    console.log(li.parentNode.parentNode.parentNode.parentNode.parentNode); //document
    console.log(li.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode); //null
  </script>
</body>

查找子节点

childNodes:返回父元素下的所有节点(包括文本节点,换行,注释节点)

children:返回父元素下的所有元素节点,返回的是伪数组

<body>
  <div>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
  </div>
  <script>
    //childNodes 返回父节点下所有的子节点 包括文本,注释
    //children 返回父节点下所有子节点,不包括文本,注释
    const div = document.querySelector('div');
    console.log(div.childNodes);  //[0: text 1: ul  2: text]
    console.log(div.children[0].children[0]);  //li
  </script>

查找兄弟节点

preiousElementSibling:查找元素上一个兄弟节点

nextElementSibling:查找元素下一个兄弟节点

<body>
  <div>
    <ul>
      <li>1</li>
      <li class="two">2</li>
      <li>3</li>
      <li>4</li>
    </ul>
  </div>
  <script>
    const two = document.querySelector('.two');
    console.log(two.previousElementSibling);  //<li>1</li>
    console.log(two.nextElementSibling);   //      <li>3</li>
  </script>
</body>

删除子节点

removeChild只能通过父元素删除亲儿子节点

<body>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4
      <p></p>
    </li>
  </ul>
  <button>
    点击删除
  </button>
  <script>
    const ul = document.querySelector('ul');
    ul.nextElementSibling.addEventListener('click', function () {
      this.previousElementSibling.removeChild(this.previousElementSibling.children[3].children[0]);
    })
  </script>

增加节点

appendChild:在父元素尾部增加元素

insertBerfore:在指定元素前面增加元素,传入两个参数,第一个参数传入增加的元素对象,第二个 传入指定元素

克隆节点

cloneNode:被克隆的节点调用,传入boolean类型的参数

传入true表示,克隆此节点以及节点以下的所有节点

传入false表示,只克隆此节点,其他都不克隆

默认参数为false

<body>
  <div>
    <p>hhh</p>
    <p>想吃肉</p>
  </div>
  <button>克隆</button>
​
  <script>
    const div = document.querySelector('div');
    div.nextElementSibling.addEventListener('click', function () {
      div.appendChild(div.children[0].cloneNode(true));
    })
  </script>
</body>

手机端事件(补充)

移动端也有自己独特的地方。比如触屏事件 touch(也称触摸事件),Android 和 IOS 都有。

触屏事件 touch(也称触摸事件),Android 和 IOS 都有。

touch 对象代表一个触摸点。触摸点可能是一根手指,也可能是一根触摸笔。触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。

触屏touch事件说明
touchstart手指触摸到一个DOM元素时触发
touchmove手指在一个DOM元素上滑动时触发
touchend手指从一个DOM元素上移开时触发

重绘和回流

浏览器是如何进行界面渲染的 ?

  1. 解析(Parser)HTML,生成DOM树(DOM Tree)
  1. 同时解析(Parser) CSS,生成样式规则 (Style Rules)
  1. 根据DOM树和样式规则,生成渲染树(Render Tree)
  1. 进行布局 Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)
  1. 进行绘制 Painting(重绘): 根据计算和获取的信息进行整个页面的绘制
  1. Display: 展示在页面上

1658929112472.png

回流(重排)

当 Render Tree 中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档的过程称为回流。

重绘

由于节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局时(比如:color、background-color、outline等), 称为重绘。

重绘不一定引起回流,而回流一定会引起重绘。