节点对象与操作

192 阅读5分钟

节点操作

一、节点概念:

定义:

DOM树的每一个内容

类型:

1、元素节点:所有的标签、HTML是根节点

2、属性节点:所有属性比如href

3、所有文本

4、其他

二、节点操作:

相对定位,局部查找,减少全局查找的次数与浏览器负荷,提高性能

查找节点:

1、节点关系:父节点、子节点、兄弟节点

2、父节点查找:parentNode

//查找最近父节点,失败返回null
dom.parentNode

2、子节点查找:children 与childNode

1、childNode获取父元素的所有子节点,包括文本节点、注释节点、标签元素

2、children返回目标元素的子元素节点(标签)

3、返回值都是伪数组对象,失败为空数组

4、无法使用forEach

dom.childNode
dom.children

3、兄弟节点:next/previousElementSibing 属性

//两个对应children都返回标签元素,获取失败返回null
dom.nextElementSibing
dom.previousElementSibing
//对应childNode的返回所有节点中的对应元素,
dom.nextSibing
dom.previousSibing

//尽量避免利用元素关系进行定位

增加节点:

1、创建节点:document.createElement('标签')

let p = document.createElement('p')
//通过innerHTML插入相应位置,可以吗?
let divBox = document.querySelector('div')
div.innerHTML = `${p}`
//通过调用dom元素.createElement('p')可以吗?
//正常方式是:通过追加节点方法进行插入

上述问题答案

问题一:dom.innerHTML = ${ElementObject},可以实现相同效果吗?

答:不可以,由createElement创建的节点是一个HTMLParagraphElement对象,拥有属性与方法,只能通过innerHTML来取innerHTML的内容值。

问题二:可以通过调用dom元素.createElement('p')吗?

答:不可以,createElement属于DOM根对象方法,不存在于dom子对象中

2、追加节点:appendChild和insertBefore()

//appendChild方法追加
farther.appendChild(元素变量)
//innerBefore指定位置插入,前置
//当第二位置参数为undefined时,默认插入到最前
farther.insertBefore(元素变量,子元素)

3、复制节点:cloneNode(Boolean)

//克隆一个已有的元素节点
dom.cloneNode(boolean)
//Boolean为拷贝类型参数
dom.cloneNode(true) //深拷贝,连带子节点一起复制
dom.cloneNode(false) //浅拷贝,只拷贝父节点
//默认值为false
删除节点

dom.remove()移除自身

farther.removeChild(dom)

1、如不存在父子关系则删除不成功

2、删除节点根本区别于隐藏节点

3、必须通过父元素删除直接子元素

//非父子元素删除报错:
The node to be removed is not a child of this node.
//不能删除孙子等节点
替换节点

语法:node.replaceChild(newnode,oldnode)

//replaceChild() 方法可将某个子节点替换为另一个
//验证是深替换还是浅替换

三、时间对象

实例化:new

创建实例
//获得当前时间
let newDate = new Date()
//获取指定时间
let oldDate = new Date('1939-10-01')
时间格式:
//星期、月、日、年、时分秒、时区
Thu Jan 20 2022 15:21:02 GMT+0800
//Object类型

时间对象方法

//获取四位数年份
dataObject.getFullYear()
//获取月份,0~11
dataObject.getMonth()
//获取月份中的每一天,当天日期
dataObject.getDate()
//获取星期,0~6
dataObject.getDay()
//获取小时,0~23
dataObject.getHours()
//获取分钟,0~59
dataObject.getMinutes()
//获取秒,0~59
dataObject.getSeconds()

返回值都为number类型

时间戳

定义:

从1970年01月01日00时00分00秒起至现在的毫秒数,它是一种特殊的计量时间的方式

获取方法:

返回值均为 number

1、getTime()

//实例化
let date = new Date()
//时间戳
console.log(date.getTime())

2、简写 +new Date()

console.log(+new Date())

3、Date.now()

console.log(Date.now())
//无需实例化
//只能获取当前时间戳,无法返回指定的时间戳

PS:

1、问题一:时间戳转24小时制

应用场景

倒计时、验证数据是否被修改、防止浏览器强制缓存

渲染步骤:

数据的渲染实现的步骤是什么样的,你有总结到渲染业务的规律吗? 答案:前提需要数据与结构,1、获取数据数组对象;2、准备数据;3、遍历拼接:结构字符串--》遍历填充替换数据;4、定点插入结构

### 四、综合案列

微博发布

注意事项:
核心程序:
    //时间处理函数
    let timeChange = function () {
      //获取当前时间
      let mytime = new Date()
      //处理时间格式
      let year = mytime.getFullYear()
      let month = mytime.getMonth() + 1
      month = month > 10 ? month : '0' + month
      let day = mytime.getDate()
      day = day > 10 ? day : '0' + day
      let hour = mytime.getHours()
      hour = hour > 10 ? hour : '0' + hour
      let minute = mytime.getMinutes()
      minute = minute > 10 ? minute : '0' + minute
      let second = mytime.getSeconds()
      second = second > 10 ? second : '0' + second
      //封装返回时间对象
      let timeObj = {}
      timeObj['CN_time'] = `${year}-${month}-${day} ${hour}:${minute}:${second}`
      return timeObj
    }
​
    //发布函数
    let send = function () {
      //调用随机数
      let rand = myRandom(0, dataArr.length - 1)
      // console.log(rand);
      //调用时间处理函数
      let currentT = timeChange().CN_time
      // console.log(currentT);
      //定义结构
      let li = document.createElement('li')
      li.innerHTML = `
          <div class="info">
          <img class="userpic" src="${dataArr[rand].imgSrc}" />
          <span class="username">${dataArr[rand].uname}</span>
          <p class="send-time">发布于 ${currentT}</p>
            </div>
            <div class="content">${textDom.value}</div>
            <span class="the_del">X</span>
          `
      //空输入检测
      // console.log(textDom.value.length);
      if (!textDom.value.length) {
        console.log('空输入');
        alert('不能发布空言论!')
      } else {
        //渲染页面
        ul.insertBefore(li, ul.children[0])
      }
​
      //清除文本内容,如何清除回车键
      textDom.value = null
      // console.log(textDom.value, textDom.value.length);
      //字数统计置零
      textDom.nextElementSibling.children[0].innerText = `0`
​
      //删除列表
      //获取删除事件源
      let deleteBtn = li.children[2]
      console.log(deleteBtn);
      //为事件源添加点击事件
      deleteBtn.addEventListener('click', function () {
        //获取父对象---li
        let liDom = this.parentNode
        // console.log(liDom);
        //移除本对象
        liDom.remove()
      })
    }
    //add SEND Event
    sendBtn.addEventListener('click', send)
​
    //字数统计
    textDom.addEventListener('input', function () {
      //获取统计数元素资源
      let CountDom = document.querySelector('.useCount')
      // console.log(CountDom);
      //获取文本框内字数
      let count = this.value.length
      //同步数值
      CountDom.innerHTML = `${count}`
    })
​
    //确认键的检测,输入符在键盘抬起才完成input操作,所以回车键的输入会滞后
    //解决方式:设置在keyup之后执行,或者添加input事件检测回车与空格的输入过滤trim
    textDom.addEventListener('keyup', function (e) {
      if (e.which == 13) {
        // console.log(textDom.value,textDom.value.length);
        //清除回车键
        // textDom.value = textDom.value.substr(0,textDom.value.length-1)
        // 手动触发按钮点击事件
        sendBtn.click()
      }
    })function (e) {
问题及解决方式:

盒子移动,定时器+2d转换

注意事项:

1、定时器的作用:与内部if结构配合发挥for的循环效果

2、

核心程序:
      //大事件
      btnBig.addEventListener('click',function(){
        // console.log(divBox.style.width);
        console.log(divBox.style);
        divBox.style.width = `${++count}00px`
      })
​
      //移动事件
      btnMove.addEventListener('click',function(){
​
        let interval = setInterval(()=>{
          if(totalWidth<500){
            //  key<50
            // key++
            // console.log(key);
            totalWidth += 10
            divBox.style.transform = `translate(${totalWidth}px,0px)`
            // divBox.style.marginLeft = `${totalWidth}px`
          }else{
            clearInterval(interval)
          }
        },100)
问题及解决方式:

五、重绘与回流

定义:

浏览器渲染页面的的过程

重绘:不影响元素在文档布局时的位置,只进行绘制(局部?)样式

回流:影响文档元素大小位置,其发生改变时,浏览器对整个文档进行重新渲染的过程

\