目录
1.DOM是什么?
DOM树:文档对象模型(doucment object model)
文档:一个页面就是一个文档,是使用document表示的
节点:网页中所有的内容,在dom树中都是节点(标签、属性、文本、注释等等),是使用node表示
标签节点:网页中所有的标签,也可以叫元素节点 是使用element表示
2.通过标签名获取元素
通过标签名获取元素 getElementsByTagName 获取到的元素对象是一个伪数组,可以通过索引获取每一个元素
var divs = document.getElementsByTagName('div')
console.log(divs[0])
for (var i = 0; i < divs.length; i++) {
// console.log(divs[i])
}
如果通过getElementsByTagName拿到的元素,即使只有一个元素,也是以伪数组的形式返回
// 想拿到里层元素,可以通过父元素获取
var box = document.getElementById('box')
console.log(box)
var span = box.getElementsByTagName('span')
console.log(span)
3.H5提供的方式
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
<ul>
<li id="li">小li</li>
<li>小li</li>
<li>小li</li>
</ul>
<script>
通过类名获取元素 获取到的是伪数组,类名前面不需要加.点
var boxs = document.getElementsByClassName('box')
// console.log(boxs)
querySelector 返回指定选择器的第一个元素 如果是获取类名 需要类名前加.点 ,通过id获取时需要加#
var box = document.querySelector('.box')
var li = document.querySelector('li')
var lis = document.querySelector('#li')
// console.log(box)
// console.log(lis)
// querySelectorAll 返回指定选择器的所有元素集合
var boxs = document.querySelectorAll('.box')
console.log(boxs)
</script>
4.获取body和html
// document.body获取body元素
var body = document.body
console.log(body)
// document.documentElement 获取html
var html = document.documentElement
console.log(html)
5.事件三要事
js其实就是让页面动态展示,
事件流程:鼠标触发----响应(执行)
事件三要素:
1、事件源(触发了谁):触发事件的元素
2、事件类型:click事件 mousermove等鼠标事件
3、事件处理程序:事件触发后要执行的代码,执行函数
*/
// 获取元素
var btn = document.querySelector('button')
console.log(btn)
// 事件类型 通过函数赋值的方式
btn.onclick = function () {
// 事件执行函数
// alert('我被弹出了')
console.log('btn被点击了')
}
6.事件案例
<style>
div {
background-color: pink;
}
</style>
<div class="div">111</div>
<span>我是行内</span>
<script>
// 获取元素
var div = document.querySelector('.div')
var span = document.querySelector('span')
// 绑定事件 注册事件类型
div.onclick = function () {
alert('谁都可以注册点击时间')
}
span.onclick = function () {
alert('span谁都可以注册点击时间')
}
</script>
7.常见事件
<div class="div">111</div>
<br>
<input type="text">
<script>
// 获取元素
var div = document.querySelector('.div')
var input = document.querySelector('input')
// console.dir(div)
// onblur input框事件 input框失去焦点时触发
// onclick 鼠标点击时触发的事件
// onchange input框事件 input内容发生改变后失去焦点触发的时间
// oninput //input框事件 input内容只要发生改变就会触发
//onfocus //input框事件 只要input获取焦点就会触发
//onmouseleave //鼠标离开事件源触发的事件
//onmousemove //鼠标在事件源上移动就会触发
// input.onblur = function () {
// console.log('onblur事件')
// }
// input.onchange = function () {
// console.log('onchange事件')
// }
// input.oninput = function () {
// console.log('oninput事件')
// }
// input.onfocus = function () {
// console.log('onfocus事件')
// }
// div.onmouseleave = function () {
// console.log('onmouseleave事件')
// }
div.onmousemove = function () {
console.log('onmousemove事件')
}
8.改变元素内容
<div class="div"><span>
111
222
</span></div>
<br>
<!-- 把input输入的内容实时展示在span标签内 -->
<input type="text">
<div>输入的内容是:<span></span></div>
<script>
// 获取元素
var div = document.querySelector('.div')
var input = document.querySelector('input')
var span = document.querySelector('span')
// 点击第一个div盒子时把111变成222
// innerText 改变元素内容 获取元素内容 会去掉空格和换行 不会去识别html标签
// innerHTML 改变元素内容 获取元素内容 会保留空格和换行 会识别html标签
var flag = true
div.onclick = function () {
// console.log(111111)
// 改变元素内容 innerText
// if (flag) {
// div.innerText = '222'
// flag = !flag
// } else {
// div.innerText = '111'
// flag = !flag
// }
// div.innerHTML = '222'
// console.log(div.innerText)
// console.log(div.innerHTML)
// div.innerText = '<h1>我是标题</h1>'
// div.innerHTML = '<h1>我是标题</h1>'
}
</script>
9.倒计时
<style>
.div {
width: 200px;
height: 200px;
background-color: pink;
cursor: pointer;
}
</style>
</head>
<body>
<button>倒计时</button>
<div class="box"></div>
<script>
// 获取元素
var div = document.querySelector('.box')
var btn = document.querySelector('button')
btn.onclick = function () {
div.innerHTML = getTime()
}
function getTime() {
var nowTime = +new Date() //现在的时间
var oldTime = +new Date('2023-6-18 20:00:00') //目标时间
var time = (oldTime - nowTime) / 1000 //把毫秒数变成秒数
var d = parseInt(time / 60 / 60 / 24) //天数
var h = parseInt(time / 60 / 60 % 24) //小时
var m = parseInt(time / 60 % 60) //分钟
var s = parseInt(time % 60) //秒
return '距离618还有' + d + '天' + h + '时' + m + '分' + s + '秒'
}
</script>
</body>
10.通过元素属性
<style>
.div {
width: 200px;
height: 200px;
background-color: pink;
cursor: pointer;
}
</style>
</head>
<body>
<img src="./img1.jpg" alt="" title="美女">
<input type="text">
<script>
// 获取元素
var img = document.querySelector('img')
var flag = true
img.onclick = function () {
// 通过修改img标签的src属性进行更改图片 语法: 元素对象名.属性名
if (flag) {
img.src = 'JavaScript组成.png'
img.title = 'JavaScript组成'
flag = !flag
} else {
img.src = 'img1.jpg'
img.title = '美女'
flag = !flag
}
}
</script>
</body>
11.this问题
<style>
.div {
width: 200px;
height: 200px;
background-color: pink;
cursor: pointer;
}
</style>
3
<body>
<div>你好呀</div>
<span>开黑不</span>
<script>
var div = document.querySelector('div')
var span = document.querySelector('span')
div.onclick = function () {
// div.innerHTML = 'hello'
// this指向事件源 谁创建的事件就是指向谁
this.innerHTML = 'hello'
// span.innerHTML = '不开黑'
this.innerHTML = '不开黑'
}
function Get(uname) {
this.uname = uname
}
var obj = new Get('张三')
console.log(obj.uname)
</script>
</body>
12.修改input内容
<style>
.div {
width: 200px;
height: 200px;
background-color: pink;
cursor: pointer;
}
</style>
</head>
<body>
<button>按钮</button>
<input type="text" value="西瓜">
<script>
var btn = document.querySelector('button')
var input = document.querySelector('input')
// 置灰 禁用
btn.onclick = function () {
input.value = '跳跳糖'
// 按钮置灰
this.disabled = true
}
</script>
</body>
13.操作style属性
<style>
div {
width: 100px;
height: 100px;
background-color: yellowgreen;
}
</style>
</head>
<body>
<div>六一儿童节快乐呀</div>
<script>
var div = document.querySelector('div')
div.onclick = function () {
// 修改样式时,属性是驼峰命名
// 元素对象.style.样式属性=值
// 通过style修改的样式是行内样式,层级比较高 但是要少用,
this.style.backgroundColor = 'red'
this.style.color = 'white'
}
// 初始化一个宽高都是100px的盒子,鼠标点击时改变宽高为200px 字体颜色为绿色,字体大小为48px
// 背景颜色改为红色
</script>
14.练习style属性
<style>
div {
width: 100px;
height: 100px;
border: 1px solid black;
background-color: darkgreen;
}
</style>
</head>
<body>
<div>六一儿童节快乐呀</div>
<script>
// 初始化一个宽高都是100px的盒子,鼠标点击时改变宽高为200px 字体颜色为绿色,字体大小为48px
// 背景颜色改为红色
var div = document.querySelector('div')
div.onclick = function () {
this.style.width = '200px'
this.style.height = '200px'
this.style.backgroundColor = 'red'
this.style.color = 'green'
this.style.fontSize = '48px'
}
</script>
15.操作className
<style>
.div {
width: 100px;
height: 100px;
}
.box {
background-color: red;
font-size: 48px;
}
</style>
</head>
<body>
<div class="div">六一儿童节快乐呀</div>
<script>
var div = document.querySelector('div')
// console.dir(div)
div.onclick = function () {
// className class关键字
// 元素对象.className='类名'
// 第一步 类名要存在(已经设置了样式)
// 第二步设置类名
// 如果元素本身存在其他的class值时,直接给className赋值其他的class类名时,会覆盖之前存在的class类名,
// 如果不想丢失之前的class类名 我们需要className赋值的时候同时带上之前的class类名 语法为:this.className = 'div box'
// this.className = 'box'
this.className = 'div box'
}
</script>
</body>
16.练习className
<style>
.div {
width: 100px;
height: 100px;
float: left;
margin-left: 10px;
background-color: red;
}
.box {
width: 200px;
height: 200px;
float: left;
margin-left: 10px;
background-color: red;
}
</style>
</head>
<body>
<div class="div">六一儿童节快乐呀</div>
<div class="div">六一儿童节快乐呀</div>
<div class="div">六一儿童节快乐呀</div>
<div class="div">六一儿童节快乐呀</div>
<span></span>
<script>
var divs = document.getElementsByTagName('div')
// var div = document.querySelector('div')
for (var i = 0; i < divs.length; i++) {
divs[i].onmousemove = function () {
this.className = 'box'
}
divs[i].onmouseleave = function () {
this.className = 'div'
}
}
// console.dir(div)
// div.onmousemove = function () {l
// this.className = 'box'
// }
// div.onmouseleave = function () {
// this.className = 'div'
// }
</script>
</body>
17.多个盒子样式变化
.div {
width: 100px;
height: 100px;
float: left;
margin-left: 10px;
background-color: red;
}
.box {
width: 200px;
height: 200px;
float: left;
margin-left: 10px;
background-color: red;
}
</style>
</head>
<body>
<div class="div">1</div>
<div class="div">2</div>
<div class="div">3</div>
<div class="div">4</div>
<script>
var divs = document.getElementsByClassName('div')
for (var i = 0; i < divs.length; i++) {
// divs[i].onmousemove = function () {
// this.className = 'box'
// }
// divs[i].onmouseleave = function () {
// this.className = 'div'
// }
// 排他思想:再给自己设置样式时先移除所有元素的样式
// 如果同时有多个标签时,需要设置相同样式,在鼠标移入移出时要先移除其他元素的样式,再给自己设置样式(先干掉所有人,只留下自己)
divs[i].onmousemove = function () {
console.log(this)
for (var i = 0; i < divs.length; i++) {
divs[i].className = ''
}
this.className = 'box'
}
divs[i].onmouseleave = function () {
for (var i = 0; i < divs.length; i++) {
divs[i].className = ''
}
this.className = 'div'
}
}
</script>
</body>
18自定义属性
<div class="div" id="div" data="1">1</div>
<div class="div" id="div" data="2">1</div>
<div class="div" id="div" data="3">1</div>
<div class="div" id="div" data="4">1</div>
<script>
// 自定义属性
// 获取自定义的属性
// 获取元素
var div = document.querySelector('.div')
// 获取元素的属性值 元素对象.属性 这种方式没法获取自定义的属性
// 如果获取的是元素对象的class类名时 需要写className,
// console.log(div.className)
// console.log(div.data)
// getAttribute('自定义属性名') 获取自定义属性 也可以获取自带的属性
console.log(div.getAttribute('data')) //1
console.log(div.getAttribute('id'))
</script>
19.自定义练习
<style>
.box {
width: 500px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
width: 500px;
}
th,
td {
border: 1px solid #d0d0d0;
padding: 10px;
}
.color {
background-color: #eaeefb;
}
</style>
</head>
<body>
<div class="box">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="check" />
</th>
<th>日期</th>
<th>姓名</th>
<th>地址</th>
</tr>
</thead>
<tbody id="tb">
<tr>
<td>
<input type="checkbox" />
</td>
<td>2016-5-3</td>
<td>黄小虎</td>
<td>上海市普陀区金沙江路 1518 弄</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>2016-5-3</td>
<td>黄小虎</td>
<td>上海市普陀区金沙江路 1518 弄</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>2016-5-3</td>
<td>黄小虎</td>
<td>上海市普陀区金沙江路 1518 弄</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>2016-5-3</td>
<td>黄小虎</td>
<td>上海市普陀区金沙江路 1518 弄</td>
</tr>
</tbody>
</table>
</div>
<script>
// 获取元素
var check = document.getElementById('check');//全选框
var tb = document.getElementById('tb');
var inputs = tb.getElementsByTagName('input') //单选框
var trs = tb.querySelectorAll('tr') //
for (var i = 0; i < trs.length; i++) {
trs[i].onmouseover = function () {
this.className = 'color';
}
// 4. 鼠标离开事件 onmouseout
trs[i].onmouseleave = function () {
this.className = '';
}
}
// 全选框的点击事件
check.onclick = function () {
console.log(this.checked);
for (var i = 0; i < inputs.length; i++) {
inputs[i].checked = this.checked;
}
}
for (var i = 0; i < inputs.length; i++) {
inputs[i].onclick = function () {
var flag = true;
for (var i = 0; i < inputs.length; i++) {
if (!inputs[i].checked) {
flag = false;
break
}
}
check.checked = flag;
}
}
</script>
</body>
20.设置自定义属性
<div class="box">
111111
</div>
<script>
// 获取元素
var div = document.querySelector('.box')
// 设置自带属性 元素对象.属性名='值' 使用这种方式不能设置自定义的属性
div.onclick = function () {
// div.id = 'box'
// div.data = '1'
// setAttribute('属性','值') 设置自定义属性 也可以设置自带的属性
div.setAttribute('data', '1')
div.setAttribute('id', 'box')
}
</script>
21.移除自定义属性
<div class="box" data="1">
111111
</div>
<script>
// 获取元素
var div = document.querySelector('.box')
// 设置自带属性 元素对象.属性名='值' 使用这种方式不能设置自定义的属性
div.onclick = function () {
// div.id = 'box'
// div.data = '1'
// setAttribute('属性','值') 设置自定义属性 也可以设置自带的属性
// div.setAttribute('data', '1')
// div.setAttribute('id', 'box')
div.removeAttribute('data')
}
</script>
22.自定义练习
<div>
<div>
<button style=" color: black; ">电影票</button>
<button style="color: red;">飞度</button>
<button style="color: blue;">致梦想</button>
<button style="color: orange;">海涛</button>
</div>
<div>
<ul>
<li>111</li>
</ul>
<ul>
<li>222</li>
</ul>
<ul>
<li>333</li>
</ul>
<ul>
<li>444</li>
</ul>
</div>
</div>
<script>
/*
点击 某个按钮,让某个按钮对应的 ul 显示,其他的ul 都隐藏
1 -找到所有的按钮 ,并循环
2 -给按钮添加点击事件
3 -点击的时候 获取的对应的按钮 获取按钮对应的下标
4 - 所有的都变为黑 点击的按钮颜色变为红色
5 - 其他的所有ul 都隐藏 按钮对应ul显示
*/
let btns = document.querySelectorAll('button') //按钮
let oUls = document.querySelectorAll('ul') //所有ul
for (let i = 0; i < btns.length; i++) {
// 点击每个按钮时
btns[i].onclick = function () {
// 遍历每个按钮,改每个按钮颜色改成白色 以及隐藏所有的ul
for (let j = 0; j < btns.length; j++) {
btns[j].style.color = 'black'
// 让所有的ul隐藏
oUls[j].style.display = 'none'
}
this.style.color = 'red'
oUls[i].style.display = 'block'
}
}
</script>
23.节点
<!-- 节点:网页中所有的内容都是节点(标签、属性、文本、注释),在DOM中,节点是使用node表示,节点可以增删改查
节点分为:nodeType:节点类型 nodeName:节点名称 nodeValue 节点值
节点有父子 兄弟节点
-->
24.父节点
<div class="box">
<div class="sbox"></div>
</div>
<script>
var sbox = document.querySelector('.sbox')
// parentNode 父节点 语法:子元素对象.parentNode 一直朝上查找父节点,知道找到document 再朝上查找就会返回null
console.log(sbox.parentNode.parentNode.parentNode.parentNode.parentNode)
// parentElement 终端父节点是html 再朝上查找就会返回null
console.log(sbox.parentElement.parentElement.parentElement.parentElement)
</script>
25.子节点
<ul>
<!-- 子节点 -->
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var ul = document.querySelector('ul')
// 子节点 childNodes 获取的是伪数组 所有的子节点(换行 注释 标签),
// ul.childNodes
// console.log(ul.childNodes[0].nodeType)
// console.log(ul.childNodes[1].nodeType)
// console.log(ul.childNodes[2].nodeType)
// console.log(ul.childNodes[3].nodeType)
// console.log(ul.childNodes[4].nodeType)
// console.log(ul.childNodes[5].nodeType)
// console.log(ul.childNodes[6].nodeType)
// console.log(ul.childNodes[7].nodeType)
// for (var i = 0; i < ul.childNodes.length; i++) {
// if (ul.childNodes[i].nodeType == 1) {
// console.log(ul.childNodes[i])
// }
// }
// children 伪数组 获取所有子节点的元素,不包含空格 注释等 ie9以上才会支持
// console.log(ul.children)
// firstChild 拿到的是第一个子节点 (如果第一个是空格 拿到的就是空格)
// firstElementChild 拿到是第一个子元素
console.log(ul.firstChild)
console.log(ul.firstElementChild)
// lastChild 拿到的是最后一个子节点 如果有空格拿到的就是空格
console.log(ul.lastChild)
console.log(ul.lastElementChild)
</script>
26.兄弟节点
<ul>
<li>1</li>上<li class="lili">2</li>下
<li>3</li>
<li>4</li>
</ul>
<script>
var lili = document.querySelector('.lili')
// nextSibling 查找下一个兄弟节点 (如果有空格 查找的就是空格)
console.log(lili.nextSibling)
// nextElementSibling 查找下一个兄弟元素
console.log(lili.nextElementSibling)
// previousSibling 查找上一个兄弟节点(如果有空格 查找的就是空格)
console.log(lili.previousSibling)
// previousElementSibling 查找上一个兄弟元素
console.log(lili.previousElementSibling)
</script>
27.创建节点
<div class="box">
<div class="box1">111111111</div>
</div>
<script>
// var arr=['王多磊','丁龙祥','王金刚','郑日安','王玉']
// 1 createElement 创建元素
var div = document.createElement('div')
var box = document.querySelector('.box')
var box1 = document.querySelector('.box1')
// 2 把创建的元素插入到页面中 appendChild(需要插入的节点)
// box.appendChild(div)
div.className = 'box2'
div.id = 'box2'
div.innerHTML = '222222'
div.style.color = 'red'
// 兄弟元素 insetBefore(要插入的节点,谁的前面)插入谁的前面
box.insertBefore(div, box1)
var div2 = document.createElement('div')
div2.innerHTML = '333333'
// box.appendChild(div2)
// 删除节点(移除)removeChild(想要移除的元素)
// box.removeChild(box1)
// remove()移除自己以及自己的后代 括号里什么都不需要写
// box.remove()
// 替换节点 replaceChild(新的节点,老的节点)
box.replaceChild(div2, box1)
// 克隆节点cloneNode() 如果括号内为空/false 则是浅拷贝(只克隆自己)
// 如果括号内为true 则是深拷贝(也会克隆自己的子孙后代)
var clone = box.cloneNode(true)
console.log(clone)
</script>
28.练习1
<ul class="ul">
</ul>
<button class="btns">新增</button>
<ul class="ul2">
</ul>
<script>
var arr = ['王多磊', '丁龙祥', '王金刚', '郑日安', '王玉']
var ul = document.querySelector('.ul')
var ul2 = document.querySelector('.ul2')
var ipt = document.querySelector('.ipt')
var btns = document.querySelector('.btns')
for (var i = 0; i < arr.length; i++) {
var li = document.createElement('li')
li.innerHTML = arr[i]
ul.appendChild(li)
var btn = document.createElement('button')
li.appendChild(btn)
btn.innerHTML = '删除'
btn.onclick = remove
}
function remove() {
console.log(111)
this.parentNode.remove()
}
var num = 1
btns.onclick = function () {
var lis = document.createElement('li')
ul2.appendChild(lis)
lis.innerHTML = num
var btn = document.createElement('button')
btn.innerHTML = '修改'
num++
}
</script>
29.练习2
<style>
.box {
width: 500px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
min-width: 300px;
}
th,
td {
border: 1px solid #d0d0d0;
padding: 10px;
}
.color {
background-color: #eaeefb;
}
</style>
</head>
<body>
<button class="btn">新增</button>
<table>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>家庭住址</th>
</tr>
</thead>
<tbody id="tb">
<tr>
<td>王多磊</td>
<td>20</td>
<td>月球</td>
</tr>
</tbody>
</table>
<script>
// 获取元素
var check = document.getElementById('check');//全选框
var tb = document.getElementById('tb');
var inputs = tb.getElementsByTagName('input') //单选框
var trs = tb.querySelectorAll('tr') //
var btn = document.querySelector('.btn')
for (var i = 0; i < trs.length; i++) {
trs[i].onmouseover = function () {
this.className = 'color';
}
// 4. 鼠标离开事件 onmouseout
trs[i].onmouseleave = function () {
this.className = '';
}
}
btn.onclick = function () {
var tr = document.createElement('tr')
var td = document.createElement('td')
td.className = 'td'
var td1 = document.createElement('td')
var td2 = document.createElement('td')
tb.append(tr)
tr.append(td)
tr.append(td1)
tr.append(td2)
var ipt = document.createElement('input')
ipt.className = 'ipt'
var ipt1 = document.createElement('input')
ipt1.className = 'ipt1'
var ipt2 = document.createElement('input')
ipt2.className = 'ipt2'
td.appendChild(ipt)
td1.appendChild(ipt1)
td2.appendChild(ipt2)
var bt = document.createElement('button')
bt.innerHTML = '提交'
bt.className = 'bt'
var bt1 = document.createElement('button')
bt1.innerHTML = '提交'
bt1.className = 'bt1'
var bt2 = document.createElement('button')
bt2.innerHTML = '提交'
bt2.className = 'bt2'
td.appendChild(bt)
td1.appendChild(bt1)
td2.appendChild(bt2)
ipt.oninput = handleChange
bt.onclick = handleBtn
}
var val = ""
function handleBtn() {
if (!val) return alert('请输入内容在进行提交')
var ipt = document.querySelector('.ipt')
var bt = document.querySelector('.bt')
var td = document.querySelector('.td')
ipt.style.display = 'none'
bt.style.display = 'none'
td.innerHTML = val
}
function handleChange() {
val = this.value
}
</script>
</body>
30.练习3
<button class="btns">新增</button>
<ul class="ul2">
</ul>
<script>
// var arr = ['王多磊', '丁龙祥', '王金刚', '郑日安', '王玉',]
var btns = document.querySelector('.btns')
var ul2 = document.querySelector('.ul2')
var num = 1
btns.onclick = function () {
// 创建节点
var li = document.createElement('li')
ul2.appendChild(li)
li.innerHTML = num
num++
}
</script>
31.练习4
<button class="btn">新增</button>
<ul class="ul">
</ul>
<script>
var arr = ['王多磊', '丁龙祥', '王金刚', '郑日安', '王玉']
var btn = document.querySelector('.btn')
var ul = document.querySelector('.ul')
var num = 0
btn.onclick = function () {
if (num > 4) return
var li = document.createElement('li')
li.innerHTML = arr[num]
ul.appendChild(li)
var btns = document.createElement('button')
btns.innerHTML = '删除'
btns.id = 'btns'
li.appendChild(btns)
num++
btns.onclick = remove
}
function remove() {
this.parentNode.remove()
}
</script>