将HTML结构以DOM树形式表现,document是最外层对象,其他标签是其子对象, 可以利用这些JS对象实现特效或与用户交互
上图:白色的是元素节点,比如div(主要是操作这个)、绿色是属性节点,比如href、黄色是文本节点,就是文字
只获取对应匹配的第一个
const nav = document.querySelector('.nav')
直接用CSS定义时的样子,括号里必须有''
如果没有匹配到返回的是null
获取多个对应匹配生成的NodeList对象集合(伪数组)
const lis = document.querySelectorAll('ul li')
直接用CSS定义时的样子,括号里必须有''
必须用for循环才能把nodeList上的对象弄出来
在下面追加DOM元素
ul.appendChild(li)
在兄弟的上面追加DOM元素
ul.insertBefore(li,ul.children[0])
克隆
DOM元素.cloneNode(布尔值)
删除
DOM元素.removeChild(要删的元素)
DOM的属性
格式化 HTML标签的文字
元素.innerText
例:div.innerText = '不能识别HTML代码'
元素.innerHTML
例:div.innerHTML = '<strong>可以识别HTML代码</strong>'
添加CSS属性( 有带" - "的属性规定用小驼峰抓取 )
元素.style.borderTop = '2px sikud red'
background-color 像这种
获取HTML滑轮滑度有多少px(可以=赋值和修改)
document.documentElement.scrollTop
获取盒子的长宽
HTML上给标签自定义选择器data-uname、sth等,DOM元素对象获取自定义的属性
<li data-lili="自定义属性">列表3</li>
const obj = document.querySelector('li:nth-child(3)')
console.log(obj.dataset.lili); `返回:自定义属性`
DOM的方法
给标签添加、替换、删除类属性,(前提是CSS上已经设置了该标签的CSS属性)
追加一个类,元素.classList.add('不用加.的类名')
切换一个类,元素.classList.toggle('不用加.的类名')
删除有一个类,元素.classList.remove('不用加.的类名')
- 上述三个是新特性,旧的标签变化只有属性使用 => div.className = '.类名' `新的class覆盖旧的,想要加多一个用className = '.nav .box'`
classList.add()的运用场景 轮播图上的小圆点亮灯,li是用nth-child(random)随机选取的,每取一次就可以用元素.classList.add()添加一次
找DOM对象的亲戚 document.getElementById()
返回<li> 元素父节点: document.getElementById("item1").parentNode
事件监听 addEventListener
就是HTML标签受到鼠标点击后、经过后、点击输入文字后等操作之后能触发函数功能的操作
增加事件: DOM对象.addEventListener('事件类型',function(e){},默认false冒泡)
解绑事件:DOM对象.removeEventListener('事件类型',函数名(要先自己定义变量))
传统on语法:
增加事件: ul.onclick = function (e) {}
解绑事件: DOM对象.onclick = null
addEventListener事件类型不会覆盖会依次执行,可设置是否冒泡
传统on会覆盖事件,只能用冒泡流
注意区分事件解绑和: 阻止元素默认行为是阻止a标签的点击默认跳转,在函数体里 e.preventDefault()
三步: DOM对象、事件类型、触发函数
DOM 事件类型
鼠标事件:
鼠标点击 'click'
鼠标经过 'mouseenter' 旧版本mouseover会有冒泡效果,不建议使用
鼠标离开 'mouseleave' 旧版本mouseout会有冒泡效果,不建议使用
焦点事件(搜索光标):
点击光标后 'focus'
失去光标后 'blur'
键盘按下后 'keydown'
键盘弹起来后 'keyup'
文本输入事件
文本输入的文字,输入就有触发并且能拿到文字 'input' console.log(input.value)就能拿到文字
M端(手机)事件
手指触摸DOM时 'touchstart'
手指上滑DOM时 'touchmove'
手指上滑离开时 'touchend'
函数就是赋值了给事件类型的名字 click就是里面定义的匿名函数的名字
window事件类型
'load', 让html先加载事件(在script上设置 )
<script>
// 让HTML先加载
window.addEventListener('load',function(){
const co = document.querySelector('.nav')
co.style.backgroundColor = 'red'
</script>
window.addEventListener('scroll',function(){
// 查看HTML(documentElement)的滑动高度scrollTop, 滑动右度scrollLeft
const top = document.documentElement.scrollTop
console.log(top);
document.documentElement.scrollTop 可以用=赋值也可以修改
e 事件对象
事件监听发生后 会产生一些数据,用一个对象把这些数据存放起来,这个对象叫事件对象
事件对象的一般常用属性
获取当前事件类型 e.type
获取光标相对于浏览器在再上角的位置 e.clientX/clientY
获取光标相对于当前DOM元素左上角的位置 e.offsetX/offsetY
用户按下键盘后的值是什么 e.key
事件对象中的 e.key属性的使用场景
冒泡和捕获
在html里有父级标签 和 子集标签,假设两个标签都有设置鼠标点击事件,
如果点击子级触发了效果之后,父级也触发了效果 就叫冒泡
如果点击父级触发了效果之后,子级也触发了效果 就叫捕获
阻止冒泡的方法用 事件对象e方法 e.stopPropagation()
<style>
.par {
width: 200px;
height: 200px;
background-color: pink;
.son {
width: 50px;
height: 50px;
background-color: green;
</style>
<div class="par">
<div class="son">
<script>
const par = document.querySelector('.par')
const son = document.querySelector('.son')
document.addEventListener('click', function () {
alert('我是爷爷')
},false) // 这里默认是false, 改成true就会变成捕获流
par.addEventListener('click', function (e) {
alert('我是爸')
e.stopPropagation() // ⭐⭐⭐阻止冒泡的e方法
},false) // 这里默认是false, 改成true就会变成捕获流
son.addEventListener('click', function () {
alert('我是儿')
},false) // 这里默认是false, 改成true就会变成捕获流
</script>
</body>
利用冒泡原理,解决同个父级标签下子级标签点击后都会到父级上触发的技巧
减少事件监听注册次数,提高性能
e.target 获得冒泡源对象(即刚刚点击的子级DOM对象)
e.target.tagName 获得冒泡源的标签名 (如 OL、UL、LI 是大写的标签名)
HTML上自定义id <li data-id="2">
, js 上拿到id const i = e.target.dataset.id
tab 用时间委托实现
<style>
width: 300px;
height: 300px;
border: 1px solid black;
.select {
color: pink;
</style>
<ul class="nav">
<li data-id="0">第一个</li>
<li data-id="1">第二个</li>
<li data-id="2">第三个</li>
<script>
const ul = document.querySelector('ul')
ul.onclick = function (e) {
if(document.querySelector('ul .select')){
document.querySelector('ul .select').classList.remove('select')
e.target.classList.add('select')
console.log(e.target.dataset.id);
</script>
</body>