

<div class="box">
    <div class="box1">你好</div>
</div>
// 1. parentNode 查找父节点
let num = document.querySelector('.box1')
num.parentNode.style.display = 'none'<div class="box">
    <img src="images/1.png">
    <i class="box1">x</i>
</div>
//点击关闭按钮, 关闭的是二维码的盒子, 还要获取erweima盒子
//点击关闭按钮, 直接关闭它的爸爸,就无需获取erweima元素了
let num = document.querySelector('.box1')
num.addEventListener('click', function () {
    this.parentNode.style.display = 'none'
})<div class="box1">
    <span class="box2"></span>
</div>
//多个二维码,点击谁,谁关闭
let num1 = document.querySelectorAll('.box2')
// 绑定多个事件给box3
for (let num2 = 0; num2 < num1.length; num2++) {
    num1[num2].addEventListener('click', function () {
// 关闭当前二维码 点击谁 就关闭父元素
        this.parentNode.style.display = 'none'
    })
}// 1. 查找子节点 children 伪元素
let num1 = document.querySelector('button')
let num2 = document.querySelector('ul')
num1.addEventListener('click', function () {
    for (let num3 = 0; num3 < num2.children.length; num3++) {
        num2.children[num3].style.color = 'green'
    }
})let num1 = document.querySelector('.btn')
let num2 = document.querySelector('.two')
num1.addEventListener('click', function () {
// 1.查找下一个节点
num2.nextElementSibling.style.color = 'red'// 2 查找上一个节点
num2.previousElementSibling.style.color = 'pink'let num2 = document.createElement('li')
num2.innerHTML = '我是创建新节点/追加节点'let num1 = document.querySelector('ul')
num1.appendChild(num2)num1.insertBefore(num2, num1.children[0])let data = [
    {
        src: 'images/course01.png',
        title: 'Think PHP 5.0 博客系统实战项目演练',
        num: 1125
    }
let num2 = document.querySelector('ul')
for (let num1 = 0; num1 < data.length; num1++) {
    let num3 = document.createElement('li')
    num3.innerHTML = `
        <img src=${data[num1].src} alt="">
            <h4>
                ${data[num1].title}
            </h4>
            <div class="info">
                <span>高级</span> • <span> ${data[num1].num}</span>人在学习
            </div>
    `
    num2.appendChild(num3)
}let num1 = document.querySelector('ul')
// 括号默认为false 则不克隆后代节点
// 若是true 则克隆后代
let num2 = num1.cloneNode(true)
document.body.appendChild(num2)let num3 = document.querySelector('button')
let num4 = document.querySelector('ol')
num3.addEventListener('click', function () {
// 语法: 父元素.removeChild(子元素)
    num4.removeChild(num4.children[0])
})// 小括号为空 可获得当前时间
let num1 = new Date()
document.write(num1)
// 小括号写时间 可返回指定时间
let num2 = new Date('2023-3-31 00:00')
document.write(num2)| 方法 | 作用 | 说明 | 
|---|---|---|
| getFullYear() | 获得年份 | 获取四位年份 | 
| getMonth() | 获得月份 | 取值为0~11 | 
| getDate() | 获得月份中的每一天 | 不同月份取值也不同 | 
| getDay() | 获取星期 | 取值为0~6 | 
| getHours() | 获取小时 | 取值为0~23 | 
| getMinutes() | 获取分钟 | 取值为0~59 | 
| getSeconds() | 获取秒 | 取值为0~59 | 
// 年月日
console.log(num1.getFullYear())
console.log(num1.getMonth() + 1)
console.log(num1.getDate())
console.log(num1.getDay())
// 时分秒
console.log(num1.getHours())
console.log(num1.getMinutes())
console.log(num1.getSeconds())// 1. 显示时间案例
fn() // 先调用函数 省去1秒空白期
setInterval(fn, 1000)
function fn() {
// 实例化时间对象 写到定时器里才行
    let arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
    let num3 = new Date()
    let n1 = num3.getFullYear()
    let n2 = num3.getMonth() + 1
    let n3 = num3.getDate()
    let n4 = num3.getDay()
    let n5 = num3.getHours()
    let n6 = num3.getMinutes()
    let n7 = num3.getSeconds()
    let n8 = document.querySelector('.box')
    n8.innerHTML = `今天是${n1}年${n2}月${n3}日 ${arr[n4]} ${n5}:${n6}:${n7}`
}// 无需实例化
// 但是只能得到当前的时间戳, 而前面两种可以返回指定时间的时间戳
// 利用将来时间减 现在时间戳 = 剩余时间毫秒
// 1.getTime() 方法
let num1 = new Date()
document.write(num1.getTime())
// 2.new +Date()
document.write(+new Date()) // 当前时间戳
document.write(+new Date('2023-4-1 00:00:00')) // 指定时间
// 3.Date.now 只能得到当前
document.write(Date.now())fn()
setInterval(fn, 1000)
function fn() {
    // 1.获取当前时间戳
    let n1 = +new Date()
    // 2.获取指定时间戳
    let n2 = +new Date('2023-4-1 00:00:00')
    // 3.计算剩余毫秒 / 1000 = 剩余秒数
    let n3 = (n2 - n1) / 1000
    // console.log(n3)
    // 4.转换时分秒
    let h = parseInt(n3 / 60 / 60 % 24)
    h = h < 10 ? '0' + h : h
    let m = parseInt(n3 / 60 % 60)
    m = m < 10 ? '0' + m : m
    let s = parseInt(n3 % 60)
    s = s < 10 ? '0' + s : s
    // console.log(h, m, s)
    let m1 = document.querySelector('#hour')
    let m2 = document.querySelector('#minutes')
    let m3 = document.querySelector('#scond')
    m1.innerHTML = h
    m2.innerHTML = m
    m3.innerHTML = s
    
    let m4 = document.querySelector('.next')
    let m5 = document.querySelector('.tips')
    let m6 = new Date()
    let m7 = m6.getFullYear()
    let m8 = m6.getMonth() + 1
    let m9 = m6.getDate()
    let m10 = m6.getHours()
    let m11 = m6.getMinutes()
    let m12 = m6.getSeconds()
    m4.innerHTML = `今天是${m7}年${m8}月${m9}日`
    m5.innerHTML = `现在是${m10}:${m11}:${m12}`
}浏览器是如何进行界面渲染的:

let s = document.body.style
s.padding = '1px' // 重排 + 重绘
s.border = '1px solid red' // 重排 + 重绘
s.color = 'red' // 重绘
s.backgroundColor = '#000' // 重绘
s.fontSize = '14px' // 重排 + 重绘let data = [
  { uname: '鲁班', imgSrc: './images/9.5/01.jpg' },
  { uname: '李白', imgSrc: './images/9.5/02.jpg' }
]
// 1. 检测用户输入字数
let text = document.querySelector('textarea')
let useCount = document.querySelector('.useCount')
let ul = document.querySelector('#list')
text.addEventListener('input', function () {
  useCount.innerHTML = this.value.length
})
// 2. 发布内容不能为空
// 点击button后判断 内容为空 则提示不能输入为空 并直接return 不能为空
// 使用字符串.trim()去掉首尾空格
// 并将表单value值设置为空字符串 同时字数设置为0
let send = document.querySelector('#send')
send.addEventListener('click', function () {
  if (text.value.trim() === '') {
    text.value = ''
    useCount.innerHTML  = 0
    return alert('内容不能为空')
  }
  // 4. 发布随机数
  function fn(min, max) {
    return Math.floor(Math.random() * (max - min + min) + min)
  }
  let fn1 = fn(0, data.length)
  // 3. 新增留言
  // 创建小li 通过innerHTML追加数据
  // 随机获取数据数组内容 替换图片名字及留言内容
  // 利用时间对象将时间动态化 new Date().toLocaleString()
  let li = document.createElement('li')
  li.innerHTML = `
    <div class="info">
      <img class="userpic" src=${data[fn1].imgSrc} />
      <span class="username">${data[fn1].uname}</span>
      <p class="send-time">发布于 ${new Date().toLocaleString()}</p>
    </div>
      <div class="content">${text.value}</div>
      <span class="the_del">X</span>
  `
  // 5. 删除留言操作 放到追加的前面
  // 在事件处理函数里获取点击按钮 注册点击事件
  // 易错点: 必须在事件里获取 外面获取不到
  // 放到追加ul的前面 创建元素同时顺便绑定了事件
  let del = li.querySelector('.the_del')
  del.addEventListener('click', function () {
    ul.removeChild(li)
  })
  // 追加给ul 用父元素.insertBefore(子元素, 元素前面)
  ul.insertBefore(li, ul.children[0])
  // 6. 重置表单域内容为空
  text.value = ''
  useCount.innerHTML = 0
})