理论基础
什么是Web API?
作用和分类
使用JavaScript操作HTML和浏览器。
分为:DOM(文档对象模型)、BOM(浏览器对象模型)
DOM对象
使用JS获取到的标签是一个Object,即DOM对象。
什么是DOM?
DOM (Document Object Model)文档对象模型是用来呈现以及与任意 HTML 或 XML 文档交互的 API。即:DOM是浏览器提供的一套专门用来操作页面内容的功能。可以实现与用户的交互,如:下拉菜单,点击切换,页面特效等等。
什么是DOM树?(文档树)
将HTML文档以树状结构直观的表现出来。
DOM树很直观的体现了标签与标签之间的关系!
什么是document?
document是DOM中的一个对象,且是最大的一个对象。
DOM
获取DOM元素的方法
前两个比较常用。
选择匹配的第一个
元素
1 | document.querySelector('css选择器') |
注意需要加单引号
‘’
选择匹配多个
元素
1 | document.querySelectorAll('css选择器') |
NodeList
返回的值为数组(NodeList),这是一个伪数组,有长度和索引,但没有pop(),push()等数组方法,想要获取里面的对象,需要通过遍历(for)的方式。
其它方式获取元素
1 | document.getElemenntById() |
修改DOM元素的内容
下文的element表示获取到的元素对象。
在</body>前追加文本
1 | document.write('文本/标签') |
write()
使用write()追加标签能够
被浏览器解析。
更新元素中的文本
1 | element.innerText = '文本' |
innerText()
使用innerText()追加标签不能够
被浏览器解析,而innerHTML可以被解析。
修改DOM元素的属性
修改常用属性
1 | element.属性 = '属性值' |
通过style控制样式
1 | element.style.属性 = '属性值' |
!!! note 关于属性的命名
将横线命名法
改为小驼峰命名法
,如:background-color改为backgroundColor。
设置class属性的值
由于class为关键字,要使用className替代
1 | element.className = '属性值' |
设置类名的覆盖问题
使用className设置类名会将以前的类名都覆盖掉。有3种方式可以解决,第一种,在属性值中保留以前类名的同时添加新类名,如:element.className = '旧类名 新类名';第二种,使用+=
赋值的方式,主要新类名前加个空格,element.className += ' 新类名';第三中方式,使用classList
操作类控制css,见下文。
使用classList设置类
1 | element.classList.add('类名') |
定时器(间隙函数)
开启定时器
每间隔一段时间,自动执行一段代码。
1 | setInterval(函数名不加小括号,间隙时间ms) |
关闭定时器
1 | let 变量名=setInterval(函数名,间隙时间) |
应用场景
当某些事件发生时,需要停止定时器,比如当用户鼠标放在轮播图上时。
事件
事件是指编程时系统内发生的动作或发生的事情。如:用户在网页上点击了一个按钮。
事件监听
让程序监听某个事件是否发生,发生后调用某个函数做出响应,也叫注册事件。
语法
1 | element.addEventListener('事件',函数名,useCapture) |
第一个参数是事件的类型(比如 “click” 或 “mousedown”)。
第二个参数是当事件发生时我们需要调用的函数。
第三个参数是布尔值,指定使用事件冒泡还是事件捕获。此参数是可选的。
注意:请勿对事件使用 “on” 前缀;请使用 “click” 代替 “onclick”。
常见的事件
事件 | 描述 |
---|---|
onchange | HTML 元素已被改变 |
onclick | 用户点击了 HTML 元素 |
onmouseover | 用户把鼠标移动到 HTML 元素上 |
onmouseout | 用户把鼠标移开 HTML 元素 |
onkeydown | 用户按下键盘按键 |
onload | 浏览器已经完成页面加载 |
resize事件
当窗口(window)发生变化时,触发的事件。
1 | window.addEventListener('resize',function(){ |
移除事件监听
传统的事件监听
1 | btn.onclick=function(e){ |
使用EventListener
1 | btn.addEventListener('事件',有名回调函数) |
节点关系
父子兄节点查询
下文
node
表示当前节点
查找节点的父节点
1 | node.parentNode |
查找节点的子节点
1 | node.children |
查找下一个兄弟节点
1 | node.nextElementSibling |
查找前一个兄弟节点
1 | node.previousElementSibling |
节点关系
子节点往往有属性节点、文本节点、标签节点,注意不要忽略了某个节点!下文中的Element
限制了只在标签节点中进行查找。更多见:节点的关系和内部操作。
节点增加
创建一个标签
1 | let 子元素=document.createElement('标签名') |
将标签放在某个位置
插入到父元素的最后一个子元素(追加)
1 | 父元素.appendChild(子元素) |
插入到父元素的某个子元素前面
1 | 父元素.insertBefore(子元素,哪个子元素前面) |
insertBefore
常常会用到父元素.children[i]
的方式,来确定第二个参数的元素位置。
克隆节点
1 | 元素.cloneNode(布尔值) |
布尔值为true,表示克隆时包含后代节点一起克隆;为false,不可龙后代节点。默认为false。
删除节点
从父元素中来删除!不存在父子关系删除失败。
1 | 父元素.removeChild(要删除的元素) |
第二种方法元素.remove()
时间对象
1 | let date=new Date() #返回当前时间 |
时间戳
时间戳是指从1970年1月1日0时0分0秒到现在的时间差,换算成毫秒数
。
获取时间戳的方法
三种方法
1 | let date=new Date(); |
时间戳转换
注意要先换算出秒!即:总秒数=时间戳/1000
重绘和回流
浏览器是如何进行界面渲染的?
HTML解析器解析HTML生成
DOM树
CSS解析器解析CSS生成
样式规则
根据DOM树和样式规则生成
渲染树
进行布局Layout(重排/回流):根据渲染树,得到节点的几何信息(位置和大小)
进行绘制Painting:根据计算和获取的信息对整个页面进行绘制
Display:显示在页面上
回流
当Render Tree(渲染树)中部分或者全部元素的尺寸、结构、布局等发生变化时,浏览器就会重新渲染部分或全部文档的过程,称为回流。
重绘
由于节点(元素)的样式发生改变但不影响它在文档流中的位置和布局时,称为重绘。
重绘和回流
重绘不一定会引起回流,但回流一定会引起重绘。
事件对象
事件对象包含了事件触发时的信息。
1 | 元素.addEventListener('事件',function(e){ |
其中的e
参数为事件对象。
常用属性
key
记录了用户按下的键盘值。
现在不提倡使用KeyCode。
type
获取当前的事件类型。如:‘click’,‘mouseenter’等
clientX/clientY
获取光标相对于浏览器可见窗左上角的位置。
offsetX/offsetY
获取光标相对于当前DOM元素左上角的位置。
preventDefault
阻止默认行为,比如:a标签的跳转行为,表单域的提交功能。
target
可以得到被点击的元素对象。
事件流
事件流是指事件完整执行过程中的流动路径。
事件捕获和事件冒泡
事件捕获
当一个元素的事件被触发,将从DOM的根元素开始执行事件。(从外到内)
1 | DOM.addEventListener('事件',回调函数,是否开启捕获布尔值) |
事件冒泡
当一个元素的事件被触发,将从被点击的元素开始,依次向上调用所有父级元素的同名事件。
阻止事件流动
关闭事件捕获和事件冒泡,让事件只在被点击的元素上发生。
1 | 事件对象.stopPropagation(); |
1 | 元素.addEventListener('事件',function(e){ |
mouseover
和mouseenter
的区别
mouseover和mouseout默认具有冒泡效果
mouseenter和mouseleave不具有冒泡效果
在需要使用鼠标经过事件时,推荐使用mouseenter
事件实现。
滚动事件和加载事件
滚动事件
监听整个页面或者某个元素的滚动事件。
1 | window.addEventListener('scroll',function(){ |
加载事件
load事件
常用于在加载完页面后再加载外部资源。也可以用在某个元素上,一般是需要花时间加载的元素比如图片。
1 | window.addEventListener('load',function(){ |
DOMContentLoaded事件
相对于load
事件,无需等待样式表、图像完全加载。监听页面DOM树加载完毕。
监听对象为document
。
1 | document.addEventListener('DOMContentLoaded',function(){ |
scroll家族
获取内容的宽高等。
scrollWidth和scrollHeight属性
这两个属性返回的是元素内容
的宽高,不带单位
。
获取html标签
使用``document.documentElement.xxx的方式获取
`。
scrollTop和scrollLeft属性
scrollTop表示的是头部被滚动的距离,即竖向滚动条移动的距离;类似的scrollLeft表示左边被滚动的距离。不带单位
。
可以用于获取,也可以用于赋值以实现回到顶部/底部的功能
。
1 | let html=document.documentElement; |
offset家族
获取元素的自身宽高,包含元素自身设置的宽高、padding、border。
1 | //返回该元素自身的宽高,包含padding、border |
client家族
获取元素当前可见内容的宽高。
1 | //返回该元素自身的宽高,不包含padding、border、滚动条 |