7.js仔必背的DOM八股

1.什么是DOM

  • DOM:文档对象模型(Document Object Model):讲页面所有的内容表示为可以修改的对象

  • 浏览器会将我们编写的html,css进行渲染,同时它又要考虑我们可能通过js对其进行操作

    • 于是浏览器将我们编写在HTML中的每一个元素(Element)抽象成一个个对象

    • 所有这些对象都可以通过js进行访问,那么我们就可以通过js来操作页面

    • 所以,我们将这个抽象过程 称之为 文档对象模型(Document O···bject Model)

  • 将文档被抽象到documnet 对象中

    • 比如document.documentElement 对应的是html元素

    • 比如document.body 对应的是body元素

    • 比如document.head 对应的是head元素

2.DOM Tree 的理解

  • 在html结构中,最终会形成一个树结构;

  • 在抽象DOM对象的时候,他们也会形成一个树结构,我们称之为DOM Tree

3.节点(node)之间的导航(实际开发不用)

  • 如果我们获取到一个节点后,可以根据这个节点去获取其他的节点,我们称之为节点之间的导航

  • 其中获取节点的导航 是包括注释和文本的 ,获取元素的导航是不包括注释和文本的

  • 如下图所示

    • 父节点:parentNode

    • 前兄弟节点:periousSibling

    • 后兄弟节点:nextSibling

    • 子节点:childNodes

    • 第一个子节点:firstChild

    • 第二个子节点:lastChild

  • //拿到以下所有的节点
    <div class="box">
        <div>我是标题</div>
        <div class="container">我是div元素</div>
        <div class="desc">我是一个段落</div>
      </div>
  • 以下是解答

        // 1.获取第一个节点
        var bodyEl = document.body;
        // 2.获取body的所有子节点
        var children = bodyEl.childNodes;
        console.log(children);
        // 3.获取 box 节点
        var boxE1  =  bodyEl.firstChild.nextSibling ;
        console.log(boxE1);
        // 4.查看box的所有子节点
        console.log(boxE1.childNodes);
        // 4.获取box的第一个子节点 h1
        var h1El = boxE1.firstChild.nextSibling;
        console.log(h1El);

4.元素(Element)之间的导航 (开发常用)

  • 如果我们获取一个元素(Element)后,可以根据这个元素去获取其他的元素,我们称之为元素之间的导航

  • 如下图所示

    • 父节点:parentElement

    • 前兄弟节点:periousElementSilbing

    • 后兄弟节点:nextElementSibling

    • 子节点:children

    • 第一个子节点:firstElementChild

    • 第二个子节点:lastElementChild

   <div class="box">
    <div>我是标题</div>
    <div class="container">我是div元素</div>
    <div class="desc">我是一个段落</div>
  </div>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
  // 1. 获取body元素
    var bodyEl = document.body
    console.log(bodyEl.children);
  // 2.获取box元素
   var boxE1 = bodyEl.firstElementChild
   console.log(boxE1);
  //  2.获取ul元素
   var ulE1 = boxE1.nextElementSibling
   console.log(ulE1);
  //  3.获取li元素
  var liEls = ulE1.children
  console.log(liEls);

5.attribute是什么

  • 一个元素有开始标签,结束标签,内容之外,还有很多属性(attribute)

  • 浏览器在解析html元素的时候,会讲对应的attribute也创建出来放在对应的元素对象上

    • 比如id、class就是全局的attribute,会有对应的id,class属性;

    • 比如href属性是针对于a元素的,type、value属性是针对于input元素的;

  • 标准的attribute:比如id、class、href、type、value等

  • 非标准的attribute:自定义的那种,比如abc、age、height等

    <div id="abc" class="box" title="box"
           age="18" height="1.88">
        我是box
      </div>
  • var boxEl = document.querySelector(".box")
    ​
        // 1.所有的attribute都支持的操作
        console.log(boxEl.hasAttribute("AGE"), boxEl.hasAttribute("abc"), boxEl.hasAttribute("id"))
        // true false true
    ​
        console.log(boxEl.getAttribute("AGE"), boxEl.getAttribute("abc"), boxEl.getAttribute("id"))
        // 18 null abc
    ​
        boxEl.setAttribute("id", "cba")
        //设置这个特性值
        
        boxEl.removeAttribute("id")
        // 移出这个特性值
    ​
        var boxAttributes = boxEl.attributes
        for (var attr of boxAttributes) {
          console.log(attr.name, attr.value)
        }
        // 遍历name属性 和 value属性
    ​
        // 2.通过getAttribute()一定是字符串类型
        var inputEl = document.querySelector("input")
        console.log(inputEl.getAttribute("checked"))

6.property是什么

  • 对于标准的attribute,会在DOM对象上创建其对应的property属性

  • 在大多数情况下,他们是相互作用的

    • 改变propety,通过attribute获取的值也会随着改变

    • 反之同理

  • 大多数情况下,设置、获取attribute,推荐使用property的方式

    • 这是因为他默认情况下是有类型的

7.元素的className和classList操作

  • 元素的class attribute,对应的property并非叫class,而是i叫className

    • 因为js早期是不允许使用class这种关键字来作为对象的属性,所以DOM规范使用了className;

    • 虽然js已经没有这样的限制,但是不推荐,并且依然使用className这个名称;

    •  var boxEl = document.querySelector(".box")
          boxEl.className = "why abc"
          // 对className 赋值,他会替换整个类的字符串
  • 但是如果添加或者移除单个class,可以使用classList属性

  • elem.classList 是一个特殊的对象:

     elem.classList.add (class) :添加一个类

     elem.classList.remove(class):添加/移除类。

     elem.classList.toggle(class) :如果类不存在就添加类,存在就移除它。

     elem.classList.contains(class):检查给定类,返回 true/false。

  • 是可迭代对象,可以通过for of遍历

    // 需求: box在active之间切换
    var btnEl = document.querySelector(".btn")
    btnEl.onclick = function() {
      // if (boxEl.classList.contains("active")) {
      //   boxEl.classList.remove("active")
      // } else {
      //   boxEl.classList.add("active")
      // }
      boxEl.classList.toggle("active")
    }

8.在js中读取style的操作

  • 可以用getComputedStyle 的全局函数 来读取

 .box {
      font-size: 20px;
    }
    
    
 var boxEl = document.querySelector(".box")
 console.log(boxEl.style.backgroundColor)
    // console.log(boxEl.style.fontSize)
​
    console.log(getComputedStyle(boxEl).fontSize)

9.在js中创建元素操作

有很多方法,比如说innerHTML 但是他不好提取里面的元素

所以常用 去创建一个DOM对象,然后创建一个元素,插入元素到DOM的某一个位置。

    // 2.真实创建一个DOM对象
    var h2El = document.createElement("h2")
    h2El.className = "title"
    h2El.classList.add("active")
    h2El.textContent = "我是标题"
    
      // 将元素插入boxEl
    // boxEl.append(h2El)
    // boxEl.prepend(h2El)
    // boxEl.after(h2El)
    // boxEl.before(h2El)
    // boxEl.replaceWith(h2El, "abc")
    
    

如上

  • 1.先创建一个元素出来 h2E1

  • 2.用className 为他写出来属性值

  • 3.用classList 追加一个属性

  • 4.用textContent 填写文本

  • 5.插入boxE1 使用插入元素的方式

  • 插入元素的方式如下:

    • node.append(...nodes or strings) —— 在 node 末尾 插入节点或字符串,

    • node.prepend(...nodes or strings) —— 在 node 开头 插入节点或字符串,

    • node.before(...nodes or strings) —— 在 node 前面 插入节点或字符串,

    • node.after(...nodes or strings) —— 在 node 后面 插入节点或字符串,

    • node.replaceWith(...nodes or strings) —— 将 node 替换为给定的节点或字符串。

  • 克隆和删除

  •  
      <button class="remove-btn">移除box</button>
      <button class="clone-btn">复制box</button>
    ​
      <div class="box">
        <h2>我是标题</h2>
        <p>我是文本, 哈哈哈哈哈</p>
      </div>
    ​
      <script>
    ​
        // 1.获取元素
        var boxEl = document.querySelector(".box")
        var removeBtnEl = document.querySelector(".remove-btn")
        var cloneBtnEl = document.querySelector(".clone-btn")
    ​
        // 2.监听removeBtn的点击
        removeBtnEl.onclick = function() {
          boxEl.remove()
        }
    ​
        // 3.复制box
        var counter = 0
        cloneBtnEl.onclick = function() {
          var newNode = boxEl.cloneNode(true)
          newNode.children[0].textContent = "我是标题" + counter
          // boxEl.after(newNode)
          document.body.append(newNode)
    ​
          counter++
        }
    ​
      </script>

    10.两个小案例

    1.动态创建列表

     <h1>动态创建列表</h1>
      <ul class="list"></ul>
    ​
      <script>
        // 1. 获取元素
        var list = document.querySelector('.list');
    ​
        // 2.获取prompt
        var isflag = true
        while(isflag){
          var message = prompt(`请输入内容`)
          if (!message){
            isflag = false
          }else{
            var li = document.createElement(`li`)
            li.textContent = message
            list.append(li)
          }
        }

    2.动态显示时间案例

    // 利用string中的一个 padStart(4,"0")方法进行格式化。4是个数,0是不满足在前补充的字符串
        function padLeft(content, count, padStr){
          count = count || 2
          padStr = padStr || "0"
    ​
          content = String(content)//转化字符串
          return content.padStart(count, padStr)
        }
    ​
        // 1.获取时间元素
        var timeEl = document.querySelector(".time")
        setInterval(function(){
          // 2.获取当前时间
        var date = new Date()
        var year = date.getFullYear()//getFullYear 该方法返回本地时间
        var month = padLeft(date.getMonth() )
        var day = padLeft(date.getDate())
        var hour = padLeft(date.getHours())
        var minute = padLeft(date.getMinutes())
        var second = padLeft(date.getSeconds())
        // 3.讲时间放在timeE1中
        timeEl.textContent = `${year}-${month}-${day} ${hour}:${minute}:${second}`
    ​
        }, 1000);
  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值