dom
文档对象模型 (DOM) 将 web 页面与到脚本或编程语言连接起来。通常是指 JavaScript,但将 HTML、SVG 或 XML 文档建模为对象并不是 JavaScript 语言的一部分。DOM 模型用一个逻辑树来表示一个文档,树的每个分支的终点都是一个节点 (node),每个节点都包含着对象 (objects)。DOM 的方法 (methods) 让你可以用特定方式操作这个树,用这些方法你可以改变文档的结构、样式或者内容。节点可以关联上事件处理器,一旦某一事件被触发了,那些事件处理器就会被执行。
Document
Document 接口表示任何在浏览器中载入的网页,并作为网页内容的入口,也就是 DOM 树 (en-US)。
节点
常见节点
1.元素节点 就是我们一个完整的标签 包括里面的属性啊内容啊
2.文本节点 就是纯文字部分
3.属性节点 比如class=‘box’
4.注释节点
5.换行节点 但是换行节点我们一般归类到文本节点里面
节点关系
- 父节点parentNode
- 子节点 childNodes
- 第一个子节点 firstChild
- 最后一个子节点 lastChild
- 前一个兄弟节点 previousSibling
- 后一个兄弟节点 nextSibling
元素节点关系
- 父元素 parentElement
- 子元素 children
- 第一个子元素 firstElemtnChild
- 最后一个子元素 lastElementChild
- 上一个兄弟元素 previousElementSibling
- 下一个兄弟节点 nextElementSibling
获取元素的方法
通过JS获取DOM元素的5种方法:
- 根据id名获取元素:getElementById;
- 根据标签名获取元素: getElementsByTagName,返回一个数组;
- 根据类名获取元素:getElementsByClassName,返回一个数组;
- 根据name属性值获取元素:getElementsByName,返回一个数组;
- 根据选择器获取元素:
querySelector:获取一个元素,推荐使用 用法类似写css;
querySelectorAll:返回一个元素数组。
判断节点类型 nodeType
对于节点类型来说 给的是数字 每一个数字对应的类型不一样
- 8 是注释节点
- 3 是文本节点
- 1 元素节点
其他类型可以查看MDN文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType
nodeName 获取节点的名字,tagName 获取元素的标签的名字
innerHTML 和 innerText
- innerHTML会识别html标签
- innerText不会识别 会原封不动的展示出来
Node.textContent
- Node 接口的 textContent 属性表示一个节点及其后代的文本内容。
- 与 innerText 的区别
不要被 Node.textContent 和 HTMLElement.innerText 的区别搞混了。虽然名字看起来很相似,但有重要的不同之处:
textContent 会获取所有元素的内容,包括
<script>
和<style>
元素,然而 innerText 只展示给人看的元素。
textContent
会返回节点中的每一个元素。相反,innerText
受CSS
样式的影响,并且不会返回隐藏元素的文本,
此外,由于innerText
受 CSS 样式的影响,它会触发回流( reflow )去确保是最新的计算样式。(回流在计算上可能会非常昂贵,因此应尽可能避免。)
与textContent
不同的是,在 Internet Explorer (小于和等于 11 的版本) 中对innerText
进行修改, 不仅会移除当前元素的子节点,而且还会永久性地破坏所有后代文本节点。在之后不可能再次将节点再次插入到任何其他元素或同一元素中。
outerHTML属性
element DOM 接口的outerHTML属性获取描述元素(包括其后代)的序列化 HTML 片段。它也可以设置为用从给定字符串解析的节点替换元素。
hidden
hidden属性是控制 元素是否显示(不占位置)
btn.onclick=function(){
// 当我原本值为true的时候 我点击要变成false
// 当我原本值为false的时候 我点击 要变成true
// if(div.hidden == false){
// div.hidden=true
// }else{
// div.hidden=false
// }
// 经典代码
div.hidden = !div.hidden
}
隐藏元素的另一种方式
div.style.display='none'
nodeValue是节点值
对于注释节点来说 拿到的是注释的内容
对于文本节点来说拿到的就是文本的内容
对于非input元素节点来说 是Null
给节点绑定时间
事件源
时间类型
监听器
- 方法一
btn.οnclick=function(){
具体操作} - 方法二
btn.addEventListener(‘click’,function () {
具体操作
})
创建节点
// 创建元素节点 createElement
// 创建文本节点 createTextNode
// 创建注释节点 createComment
// 创建属性节点 createAttribute
挂载节点
// node.append(要插入的元素) 在node的末尾插入节点或者字符串(作为最后一个子元素插入)
// bodyEle.append(div)
// node.prepend(要插入的元素) 在node的开头插入节点或者字符串(作为第一个子元素插入)
// bodyEle.prepend(div)
// node.before(要插入的元素) 在node的前面插入元素(作为兄弟元素插入)
// uls.before(div)
// node.after(要插入的元素) 在node的后面插入元素(作为兄弟元素插入)
// uls.after(div)
// node.replaceWith(要替换的元素) 将node替换成新的元素
删除和替换节点
// removeChild 父元素.removeChild(子元素) 移除子元素
// 这里的父元素和子元素 都得是dom对象
// remove() 元素.remove() 移除自己
// replaceChild 父元素.replaceChild(新元素,旧的要被替换的子元素)
// 用新元素把旧的元素替换掉
// 元素.cloneNode(布尔值) 整体的值是克隆好的元素 这里面的布尔值 如果是true表示深克隆 否则是浅克隆
// 深克隆就是连同子节点一起克隆 浅克隆就是只有标签
属性节点
标准(自带的如class(className)、name等)
非标准(自定义)
属性节点操作
-
attribute方式操作属性节点
通过方法来操作,常用的方法有如下几个
getAttribute 获取
setAttribute 设置
hasAttribute 查找
removeAttribute 移除
可以操作标准属性节点(固有的)和非标准属性节点(自定义的) -
property方式操作属性节点
通过打点调用的方式 节点.属性名
只能操作标准属性节点 -
h5 自定义属性(以data-开头)
可以直接打点调用
如
<div data-id="0"></div>
获取 div.dataset.id
className和classlList
- className属性值是一个字符串 相当于直接把class里面的所有内容都拿了过来
- 通过className修改样式的时候,就是把类名完全替换掉
- classList属性值是一个数组 相当于把class中每一个元素都放到了数组中作为元素
- classList.add()增加
- classList.remove()移除
- classList.contains ()检测是否包含
- classList.toggle()有就移除,没有就添加
通过style修改样式
注意后面属性有-号,改写成小驼峰命名法
元素.style.属性=''
div.style.backgroundColor='red'
getComputedStyle属性
- 对于内联样式 你可以通过style.的形式 可以拿到
- var p=document.getElementsByTagName(‘p’)[0];
- 对于css文件中的或者style标签里面的 你拿不到
- 可以通过getComputedStyle拿到全局样式
- 全局的样式 是只读的 不能进行修改
js操作盒子模型
client系列: width, height, top, left
clientWidth/clientHeight: 获取盒子或页面可视区域的宽高
clientTop:获取盒子的上边框的大小
clientLeft:获取盒子的左边框的大小
offset系列: width, height, top, left, parent
offset系列: width, height, top, left, parent
offsetWidth/offsetHeight: 获取盒子或页面可视区域的宽高+border
offsetTop:获取一个定位元素相对于参考点的上面的距离
offsetLeft:获取一个定位元素相对于参考点的左面的距离
offsetParent:获取一个定位元素的参考点
scroll系列: width, height, top, left
scroll系列: width, height, top, left
scrollWidth/scrollHeight:获取盒子或页面真实内容的宽度
scrollTop:获取页面或盒子向上卷去的高度
scrollLeft:获取页面或盒子向左卷去的宽度 基本上用不到
需要记的三个常用高度:
总结
获取一张网页可视区的高度:document.body.clientHeight
获取一张网页真实的高度:document.body.scrollHeight
获取一张网页卷去的高度:document.body.scrollTop
事件处理
**手动调用事件
-
xx.click()(addEventListener)//此方法不能调用dom2,change事件
-
xx.dispatchEvent(new Event(‘change’))
-
xx.onclick();(onclick)
事件类型
事件 + 事件的反馈 = 前端交互(前端的核心)
鼠标事件:
键盘事件:
事件的执行顺序是 onkeydown、onkeypress、onkeyup
加载事件:
- load 加载 浏览器不仅加载完成了 HTML,还加载完成了所有外部资源 事件源是window
- unload 加载 退出页面 此事件不好捕获到 也没有什么用
- DOMContentLoaded:浏览器已完全加载 HTML,并构建了 DOM 树,但像 img 和样式表之类的外部资源可能尚未加载 完成。
## 表单事件:
- focus: 获取焦点
- blur: 失去焦点
- change: 改变输入框中的内容,并失去焦点时触发
- input:内部发生变化,立即触发,不等到失去焦点
- submit: 当点击了提交按钮,会触发submit事件
- reset: 当点击了重置按钮,会触发reset事件
其它事件:
- resize: 改变了浏览器窗口大小时,会触发resize事件
- scroll: 页面滚动时,会触发scroll事件
事件的绑定和解绑
HTML级别的事件绑定
可以在HTML开始标签上,去绑定事件,这种绑定基本不用
DOM0事件绑定
btn.onclick = function(){}
- DOM0事件绑定,就是给DOM元素的onxxxx属性赋值,是基于属性赋值的操作
- 基于属性赋值 如果重复绑定多次,后面的会覆盖前面的
- dom0级别的事件绑定优先级是高于HTML级别的事件绑定的
DOM2的事件绑定
DOM2的事件绑定是基于事件池的,不是基于属性赋值的,所以可以多次绑定,不会覆盖掉
btn.addEventListener("click",function(){}
事件解绑
- DOM0的解绑
this.onclick = null; // DOM0的解绑
- DOM2的事件解绑
btn.removeEventListener("click", fn)
事件冒泡和事件捕获
- 冒泡:从内到外
- 捕获:从外到内
- addEventListener
第3个参数为
true表示捕获阶段触发,
false表示冒泡阶段触发,默认值为
false` - 阻止
e.stopPropagation()
事件对象
常见的属性:
- type:事件的类型;
- target:当前事件发生的元素;
- currentTarget:当前处理事件的元素;
- eventPhase:事件所处的阶段;
- offsetX、offsetY:事件发生在元素内的位置;
- clientX、clientY:事件发生在客户端内的位置;
- pageX、pageY:事件发生在客户端相对于document的位置;
- screenX、screenY:事件发生相对于屏幕的位置;
常见的方法:
- preventDefault:取消事件的默认行为;
- stopPropagation:阻止事件的进一步传递(冒泡或者捕获都可以阻止);
事件委托
事件冒泡在某种情况下可以帮助我们实现强大的事件处理模式 – 事件委托模式(也是一种设计模式)
- 当子元素被点击时,父元素可以通过冒泡可以监听到子元素的点击;
- 可以通过event.target获取到当前监听的元素;
BOM
BOM:浏览器对象模型(Browser Object Model)
BOM主要包括一下的对象模型
- window:包括全局属性、方法,控制浏览器窗口相关的属性、方法
- location:浏览器连接到的对象的位置(URL)
- history:操作浏览器的历史
- navigator:用户代理(浏览器)的状态和标识(很少用到)
- screen:屏幕窗口信息(很少用到)
window
window对象在浏览器中可以从两个视角来看待
- 视角一:全局对象 GO
- 视角二:浏览器窗口对象, 提供了对浏览器操作的相关的API
window对象的作用
- 第一:包含大量的属性,localStorage、console、location、history、screenX、scrollX等等(大概60+个属性)
- 第二:包含大量的方法,alert、close、scrollTo、open等等(大概40+个方法)
- 第三:包含大量的事件,focus、blur、load、hashchange等等(大概30+个事件)
- 第四:包含从EventTarget继承过来的方法,addEventListener、removeEventListener、dispatchEvent方法
- MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Window
location对象
location对象用于表示window上当前链接到的URL信息
常见的属性有哪些
- href: 当前window对应的超链接URL, 整个URL;
- protocol: 当前的协议;
- host: 主机地址;
- hostname: 主机地址(不带端口);
- port: 端口;
- pathname: 路径;
- search: 查询字符串;
- hash: 哈希值;
常见的方法有哪些
- assign:赋值一个新的URL,并且跳转到该URL中
- replace:打开一个新的URL,并且跳转到该URL中(不同的是不会在浏览记录中留下之前的记录)
- reload:重新加载页面,可以传入一个Boolean类型
URLSearchParams介绍
- URLSearchParams 定义了一些实用的方法来处理 URL 的查询字符串
- 可以将一个字符串转化成URLSearchParams类型
- 也可以将一个URLSearchParams类型转成字符串
- 中文会使用encodeURIComponent和decodeURIComponent进行编码和解码
URLSearchParams常见的方法
- get:获取搜索参数的值;
- set:设置一个搜索参数和值;
- append:追加一个搜索参数和值;
- has:判断是否有某个搜索参数;
- https://developer.mozilla.org/zh-CN/docs/Web/API/URLSearchParams
history对象
history对象允许我们访问浏览器曾经的会话历史记录
常见属性
- length:会话中的记录条数
- state:当前保留的状态值
常用方法
- back():返回上一页,等价于history.go(-1);
- forward():前进下一页,等价于history.go(1);
- go():加载历史中的某一页;
- pushState():打开一个指定的地址;
- replaceState():打开一个新的地址,并且使用replace;
navigator对象(了解)
screen对象(了解)
- screen主要记录的是浏览器窗口外面的客户端显示器的信息
- 比如屏幕的逻辑像素 screen.width、screen.height