1.什么是节点:
在HTML文档中,一切皆节点(HTML文档本身、标签、属性、注释内容、文本)
2.什么是元素:
元素在HTML中叫做标签,在JS的dom对象中称为元素(可以理解为标签的面向对象的叫法)
3.HTML标签属于节点的一种,叫做元素节点
4.节点三要素:
1. 节点类型:元素、属性、注释、文本
2. 节点名称:p、div、class(标签名)
3. 节点的值:one(属性的值
<body>
<ul>
我是文本哈
<li>我是班长1</li>
<li>我是班长2</li>
<li>我是班长3</li>
<li>我是班长4</li>
<li>我是班长5</li>
</ul>
<script>
let ul = document.querySelector('ul')
console.log(ul.childNodes);
console.log(ul.children)
</script>
5.兄弟节点
查询节点
1.获取兄弟元素 :
获取上一次元素 : 元素.previousElementSibling
获取下一次元素 : 元素.nextElementSibling
获取元素
<body>
<button class="btn">点我操作li2的兄弟节点</button>
<ul>
<li>我是班长1</li>
<li id="li2">我是班长2</li>
<li>我是班长3</li>
<li>我是班长4</li>
<li>我是班长5</li>
</ul>
<script>
let li2 = document.querySelector('#li2')
document.querySelector('.btn').onclick = function () {
console.log(li2.previousElementSibling)
li2.previousElementSibling.style.color = 'red'
console.log(li2.nextElementSibling)
li2.nextElementSibling.style.color = 'red'
}
</script>


6. 子节点
1.获取子节点 : 父元素.childNodes
2.获取子元素节点(重点): 父元素.children
<ul>
我是文本哈
<li>我是班长1</li>
<li>我是班长2</li>
<li>我是班长3</li>
<li>我是班长4</li>
<li>我是班长5</li>
</ul>
<script>
let ul = document.querySelector('ul')
console.log(ul.childNodes)
console.log(ul.children)
</script>
7.父节点
学习目标: 获取父节点
子元素.parentNode
<body>
<ul>
<li>我是班长1</li>
<li id="li2">我是班长2</li>
<li>我是班长3</li>
<li>我是班长4</li>
<li>我是班长5</li>
</ul>
<script>
let li2 = document.querySelector('#li2')
console.log(li2.parentNode)
console.log(li2.parentNode.parentNode)
console.log(li2.parentNode.parentNode.parentNode)
console.log(li2.parentNode.parentNode.parentNode.parentNode)
console.log(li2.parentNode.parentNode.parentNode.parentNode.parentNode)
</script>
</body>
8.新增节点
<body>
<button class="btn1">添加到最后面</button>
<button class="btn2">添加到li2前面</button>
<button class="btn3">添加到最前面</button>
<ul>
<li>我是班长1</li>
<li id="li2">我是班长2</li>
<li>我是班长3</li>
<li>我是班长4</li>
<li>我是班长5</li>
</ul>
<script>
let ul = document.querySelector('ul')
let li2 = document.querySelector('#li2')
let newLi = document.createElement('li')
newLi.innerText = '我是新来的'
console.log(newLi)
document.querySelector('.btn1').onclick = function () {
ul.appendChild(newLi)
}
document.querySelector('.btn2').onclick = function () {
ul.insertBefore(newLi,li2)
}
document.querySelector('.btn3').onclick = function () {
ul.insertBefore(newLi, ul.children[0] )
}
</script>

9. 克隆节点
克隆节点
ul.cloneNode(布尔类型)
默认false:不克隆后代节点
true:克隆后代节点
.box{
width: 300px;
height: 100px;
border: 1px solid pink;
margin-top: 10px;
}
</style>
<button class="btn">点我克隆节点</button>
<div class="box">
<a href="我是链接"></a>
<p>我是p标签</p>
<ul>
<li>我是ikun1</li>
<li>我是ikun2</li>
</ul>
</div>
let box = document.querySelector('.box')
document.querySelector('.btn').onclick = function(){
let newBox = box.cloneNode(true)
document.body.appendChild(newBox)
}

10. 删除节点
语法: 父元素.removeChild(子元素)
删除节点注意事项: 删除节点一定是父子关系才能删除,比如ul和li
<button class="btn">点我删除节点</button>
<ul>
<li>我是班长1</li>
<li id="li2">我是班长2</li>
<li>我是班长3</li>
<li>我是班长4</li>
<li>我是班长5</li>
</ul>
<script>
document.querySelector('.btn').onclick = function () {
let ul = document.querySelector('ul')
let li2 = document.querySelector('#li2')
ul.removeChild(li2)
}
</script>

display = 'none'和removeChild的区别
display = 'none'只是修改样式,把元素隐藏起来,标签还在document树里面
removeChil是直接删除标签

11.内置对象Date: 日期对象
1.创建日期对象
let d = new Date()
console.log(d)
2.转换日期格式
console.log( d.toLocaleString() )
console.log( d.toLocaleDateString() )
console.log( d.toLocaleTimeString() )
3.获取 年月日时分秒
console.log( d.getFullYear() )
范围下标 0-11 对应 1-12月
console.log( d.getMonth() )
console.log( d.getDate() )
星期下标 0-6 对应 周日-周六
console.log( d.getDay() )
console.log( d.getHours() )
console.log( d.getMinutes() )
console.log( d.getSeconds() )
4.获取时间戳 : 返回从1970年1月1日零点 到此时此刻的 毫秒数
时间戳作用 : 解决地球不同地区时差问题
UTC时区:全球时区 GMT时区:东8区
console.log( Date.now() )//1642489697575
console.log( +new Date() )//1642489741950
console.log( new Date().getTime() )//1642489741950
12. 定时器
12.1-setInterval永久定时器
1.定时器作用 : 一段代码 间隔时间 重复执行
2.定时器语法 :
2.1 setInterval : 永久定时器。 一旦开启,永久重复执行,只能手动清除
开启: let timeID = setInterval( function(){} , 间隔时间 )
关闭: clearInterval(timeID)
* @description: 开启定时器
* @param {function} 一段代码
* 回调函数 : 如果一个函数的参数也是函数,这个参数函数就叫做回调函数
* @param {number} 间隔时间 单位毫秒 1s = 1000ms
* @return: 定时器id
* 一个页面可以开启很多定时器,浏览器为了更好管理这些定时器。
会给每一个定时器一个编号。称之为定时器id
<body>
<button class="btn">移除定时器</button>
<p id="pp">0</p>
<script>
let pp = document.querySelector('#pp')
let timeID = setInterval( function(){
pp.innerText++
或
} ,1000 )
document.querySelector('.btn').onclick = function(){
clearInterval(timeID)
}
</script>
</body>

12.2-setTimeout一次定时器
1.定时器作用 : 一段代码 间隔时间 重复执行
2.定时器语法 :
2.1 永久定时器 : 一旦开启, 间隔时间永久执行。只能手动清除
开启: let timeID = setInterval( function(){} , 间隔时间 )
关闭: clearInterval(timeID)
2.2 一次定时器 : 间隔时间内,只会执行一次。执行完毕后自动清除。
开启: let timeID = setTimeout( function(){}, 间隔时间 )
关闭 : clearTimeout(timeID)
注:一次定时器如果要关闭,只有在规定时间内关闭才有效果.
例如,下面的定时器只有在5秒内点击 ''移除定时器''才能清除定时器,不让0加1
* @description: 开启定时器
* @param {function} 一段代码
* 回调函数 : 如果一个函数的参数也是函数,这个参数函数就叫做回调函数
* @param {number} 间隔时间 单位毫秒 1s = 1000ms
* @return: 定时器id
* 一个页面可以开启很多定时器,浏览器为了更好管理这些定时器。
会给每一个定时器一个编号。称之为定时器id
<body>
<button class="btn">移除定时器</button>
<p id="pp">0</p>
<script>
let timeID = setTimeout( function(){
document.querySelector('#pp').innerText++
} , 5000 )
document.querySelector('.btn').onclick = function(){
clearTimeout(timeID)
}
</script>
</body>
13.setInterval案例:电商秒杀
<style>
span {
display: inline-block;
width: 30px;
height: 30px;
background-color: #000;
color: #fff;
font-size: 22px;
text-align: center;
line-height: 30px;
}
</style>
</head>
<body>
<div>
<span id="hour">00</span> : <span id="minute">00</span> :
<span id="second">05</span>
</div>
<script>
let timeID = setInterval(function () {
let h = +document.querySelector('#hour').innerText
let m = +document.querySelector('#minute').innerText
let s = +document.querySelector('#second').innerText
s--
if (s < 0) {
s = 59
m--
}
if( m < 0 ){
m = 59
h--
}
s = s < 10 ? '0' + s : s
m = m < 10 ? '0' + m : m
h = h < 10 ? '0' + h : h
document.querySelector('#hour').innerText = h
document.querySelector('#minute').innerText = m
document.querySelector('#second').innerText = s
if( h == 0 && m == 0 && s == 0){
clearInterval(timeID)
}
}, 1000)
</script>
</body>



14.小米搜索框案例:
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
ul {
list-style: none;
}
.mi {
position: relative;
width: 223px;
margin: 100px auto;
}
.mi input {
width: 223px;
height: 48px;
padding: 0 10px;
font-size: 14px;
line-height: 48px;
border: 1px solid #e0e0e0;
outline: none;
transition: all 0.3s;
}
.mi .search {
border: 1px solid #ff6700;
}
.result-list {
display: none;
position: absolute;
left: 0;
top: 48px;
width: 223px;
border: 1px solid #ff6700;
border-top: 0;
background: #fff;
}
.result-list a {
display: block;
padding: 6px 15px;
font-size: 12px;
color: #424242;
text-decoration: none;
}
.result-list a:hover {
background-color: #eee;
}
</style>
</head>
<body>
<div class="mi">
<input type="search" placeholder="小米笔记本" />
<ul class="result-list">
<li><a href="#">全部商品</a></li>
<li><a href="#">小米11</a></li>
<li><a href="#">小米10S</a></li>
<li><a href="#">小米笔记本</a></li>
<li><a href="#">小米手机</a></li>
<li><a href="#">黑鲨4</a></li>
<li><a href="#">空调</a></li>
</ul>
</div>
<script>
let input = document.querySelector("input")
let ul = document.querySelector(".result-list")
input.onfocus = function() {
console.log("鼠标点击表单,出现闪烁光标。此时可以键盘输入")
input.classList.add('search')
ul.style.display = 'block'
}
input.onblur = function() {
console.log("鼠标点击空白区域,闪烁光标小时。此时不可以键盘输入")
input.classList.remove('search')
ul.style.display = 'none'
}
</script>
</body>

15.this指向
this : 环境对象. 一般用在函数中,规则是 :谁调用我,我就指向谁
在事件处理函数中, this指向事件源,简单来说这个事件是谁的,this就代表谁
说人话: this相当于中文'我', 这个字是谁说的,就代表谁

16.案例:点击 'x' 关闭广告
<style>
.box {
border: 1px solid #D9D9D9;
margin: 100px auto;
position: relative;
width: 107px;
}
#x {
border: 1px solid #D9D9D9;
width: 14px;
height: 14px;
line-height: 14px;
color: #D6D6D6;
cursor: pointer;
position: absolute;
top: 0;
left: -15px;
}
</style>
</head>
<body>
<div class="box">
<img src="images/taobao.jpg" alt="" />
<span id="x">×</span>
</div>
<script>
let x = document.querySelector('#x')
x.onclick = function(){
this.parentNode.style.display = 'none'
}
</script>

17.innerHTML和createElement性能问题
<body>
<button class="btn">点我啊</button>
<script>
document.querySelector('.btn').onclick = function () {
for (let i = 1; i <= 1000; i++) {
let p = document.createElement('p')
p.innerText = `我是第${i}个p标签`
document.body.appendChild(p)
}
}
</script>

18.自动消失广告
<style>
img {
position: absolute;
right: 0;
bottom: 0;
}
</style>
</head>
<body>
<img src="./images/ad.png" alt="转存失败,建议直接上传图片文件">
<script>
setTimeout(function(){
let img = document.querySelector('img')
img.parentNode.removeChild(img)
},3000)
</script>
19.对象和字符串关于赋值的区别:





20.微博发布
<style>
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
.w {
width: 900px;
margin: 0 auto;
}
.controls textarea {
width: 878px;
height: 100px;
resize: none;
border-radius: 10px;
outline: none;
padding-left: 20px;
padding-top: 10px;
font-size: 18px;
}
.controls {
overflow: hidden;
}
.controls div {
float: right;
}
.controls div span {
color: #666;
}
.controls div .useCount {
color: red;
}
.controls div button {
width: 100px;
outline: none;
border: none;
background: rgb(0, 132, 255);
height: 30px;
cursor: pointer;
color: #fff;
font: bold 14px '宋体';
transition: all 0.5s;
}
.controls div button:hover {
background: rgb(0, 225, 255);
}
.controls div button:disabled {
background: rgba(0, 225, 255, 0.5);
}
.contentList {
margin-top: 50px;
}
.contentList li {
padding: 20px 0;
border-bottom: 1px dashed #ccc;
position: relative;
}
.contentList li .info {
position: relative;
}
.contentList li .info span {
position: absolute;
top: 15px;
left: 100px;
font: bold 16px '宋体';
}
.contentList li .info p {
position: absolute;
top: 40px;
left: 100px;
color: #aaa;
font-size: 12px;
}
.contentList img {
width: 80px;
border-radius: 50%;
}
.contentList li .content {
padding-left: 100px;
color: #666;
word-break: break-all;
}
.contentList li .the_del {
position: absolute;
right: 0;
top: 0;
font-size: 28px;
cursor: pointer;
}
</style>
</head>
<div class="w">
<div class="controls">
<img src="./images/9.6/tip.png" alt="转存失败,建议直接上传图片文件"><br>
<textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="200"></textarea>
<div>
<span class="useCount" id="useCount">0</span>
<span>/</span>
<span>200</span>
<button id="send">发布</button>
</div>
</div>
<div class="contentList">
<ul id="list"></ul>
</div>
</div>
<li hidden>
<div class="info">
<img class="userpic" src="./images/9.6/03.jpg" />
<span class="username">死数据:百里守约</span>
<p class="send-time">死数据:发布于 2020年12月05日 00:07:54</p>
</div>
<div class="content">死数据:111</div>
</li>
<script>
// maxlength 是一个表单属性, 作用是给表单设置一个最大长度
// 模拟数据
let dataArr = [
{ uname: '司马懿', imgSrc: './images/9.5/01.jpg' },
{ uname: '女娲', imgSrc: './images/9.5/02.jpg' },
{ uname: '百里守约', imgSrc: './images/9.5/03.jpg' },
{ uname: '亚瑟', imgSrc: './images/9.5/04.jpg' },
{ uname: '虞姬', imgSrc: './images/9.5/05.jpg' },
{ uname: '张良', imgSrc: './images/9.5/06.jpg' },
{ uname: '安其拉', imgSrc: './images/9.5/07.jpg' },
{ uname: '李白', imgSrc: './images/9.5/08.jpg' },
{ uname: '阿珂', imgSrc: './images/9.5/09.jpg' },
{ uname: '墨子', imgSrc: './images/9.5/10.jpg' },
{ uname: '鲁班', imgSrc: './images/9.5/11.jpg' },
{ uname: '嬴政', imgSrc: './images/9.5/12.jpg' },
{ uname: '孙膑', imgSrc: './images/9.5/13.jpg' },
{ uname: '周瑜', imgSrc: './images/9.5/14.jpg' },
{ uname: '老夫子', imgSrc: './images/9.5/15.jpg' },
{ uname: '狄仁杰', imgSrc: './images/9.5/16.jpg' },
{ uname: '扁鹊', imgSrc: './images/9.5/17.jpg' },
{ uname: '马可波罗', imgSrc: './images/9.5/18.jpg' },
{ uname: '露娜', imgSrc: './images/9.5/19.jpg' },
{ uname: '孙悟空', imgSrc: './images/9.5/20.jpg' },
{ uname: '黄忠', imgSrc: './images/9.5/21.jpg' },
{ uname: '百里玄策', imgSrc: './images/9.5/22.jpg' }
]
/* 思路分析
1.输入框输入事件 : oninput
* 获取输入框文本长度 赋值给 span标签的innerText
2.点击发布
2.1 新增li元素
(1)创建空标签
(2)设置标签内容
(3)添加到ul
*/
//1.获取元素
let area = document.querySelector('#area')
let useCount = document.querySelector('.useCount')
//2.1 输入框输入事件
area.oninput = function(){
//3.获取输入框文本长度 赋值给 span标签的innerText
useCount.innerText = area.value.length
}
//2.2 点击发布
let send = document.querySelector('#send')
let list = document.querySelector('#list')
send.onclick = function(){
//3.新增li元素
//(1)创建空标签
let newLi = document.createElement('li')
//(2)设置标签内容
//数组随机下标
let index = parseInt(Math.random()*dataArr.length)
newLi.innerHTML = `<div class="info">
<img class="userpic" src="${dataArr[index].imgSrc}" />
<span class="username">${dataArr[index].uname}</span>
<p class="send-time">${ new Date().toLocaleString() }</p>
</div>
<div class="content">${area.value}</div>`
//(3)添加到ul : 添加到最前面
list.insertBefore(newLi , list.children[0] )
//3.2 清空输入框和span文本
area.value = ''
useCount.innerText = 0
}
