从浏览器架构认识BOM和DOM
浏览器架构
JavaScript运行在浏览器,BOM就是连接JavaScript代码和浏览器的桥梁,而DOM就是用来操作各种标签元素的。
BOM包括 window、history、location、document ...
DOM包括 Document(整个文档)、Element(标签元素)、CharacterData(字符数据)、Attr(属性),这些元素又可以继续往下划分。
其中DOM元素、window对象都继承自EventTarget,所以它们都有EventTarget上的实例方法,而document是HTMLDocument的实例对象
console.log(window.__proto__);
console.log(window.__proto__.__proto__);
console.log(window.__proto__.__proto__.__proto__);
console.log(document.__proto__);
console.log(document.__proto__.__proto__);
console.log(document.__proto__.__proto__.__proto__);
console.log(document.__proto__.__proto__.__proto__.__proto__);
EventTarget
EventTarget有三个原型方法,在window和DOM元素上都可以使用
- addEventListener 给元素绑定事件
- removeEventListener 移除元素绑定的事件
- dispatchEvent 派发事件
给window对象绑定 "click" 点击事件
window.addEventListener('click', (event)=>{
console.log('屏幕被点击啦')
})
BOM
BOM主要包括以下几个对象
- window:包括全局、控制浏览器窗口相关的属性、方法
- history:浏览器曾经的会话历史记录
- location:访问的URL的信息
- document:当前窗口操作的文档对象
window
window在浏览器端有两个作用
一、作为全局对象
作为全局对象时,它主要有两个用途
- 通过var定义的变量将被挂载到window上
- 提供了全局方法 setTimeout、Math、Date
var user = "alice";
console.log(window.user);
window.setTimeout(() => {
console.log(window.setTimeout);
}, 0);
二、作为浏览器的窗口对象
作为浏览器的窗口对象承担着非常多的功能
- 包含大量的属性,localStorage、console、location、history、screenX、scrollX ...
- 包含大量的方法,alert、close、scrollTo、open ...
- 包含大量的事件,focus、blur、load、hashchange ...
- 包含从EventTarget继承 addEventListener、removeEventListener、dispatchEvent方法
window 的属性/方法/事件,可以省略window,直接使用其属性/方法/事件
console.log(window.screenX);
console.log(console);
scrollTo(200, 200);
window.onload = function () {
console.log("onload事件");
};
location
location中有大量关于url的信息,常用的是这些
- hash:锚点,url上#号后面的内容,可以用于页面中定位
- host:主机+端口号
- hostname:主机
- href:完整url链接
- pathname:路径
- port:端口号
- protocol:协议
在控制台上直接输入 location,可以获取到 location 对象的信息
location还有三个方法,也和url相关
- assign:跳转一个新的url页面
- replace:替代当前页面,不会被保存到历史记录中,表示不能通过后退按钮回到该页面
- reload:重新加载当前url的资源
history
history用来保存浏览器会话记录,可以通过history的方法跳转上、下一个页面
它有两个属性
- length:history栈的长度,表示保存了几条数据
- state:通过pushState/repleaceState 方法跳转保留的状态值
还有五个方法
- pushState:跳转某一地址,三个参数分别为保存的state,页面的title,跳转的url地址
- replaceState:替换当前地址
- go:前进/后退指定页,传入数字
- back:后退一页,相当于 go(-1)
- forward::前进一页,相当于go(1)
window.addEventListener("click", () => {
history.pushState({ name: "alice" }, null, "/home");
console.log(history.length);
console.log(history.state);
});
用一张图来总结BOM的用法
DOM
浏览器中有很多标签,DOM就是用来操作它们的。DOM元素都继承自EventTarget,所以它们都有实例上的属性方法,也继承自Node,同样具有Node的属性和方法。
Node再往下划分,就是各个DOM元素,它们有各自的特征
- Document:文档,包含HTMLDocument(html文档)、XMLDocument(xml文档)
- Element:标签元素,包含HTMLElement,HTMLElement又包含HTMLDivElement(div元素),HTMLImageElement(img元素)
- CharacterData:字符数据、文本,包含Text(标签中的内容)、Comment(注释)
- Attr:属性,比如 name,class
node
node是其它元素的父类,它所拥有的属性,子元素都有,以下几个属性和方法比较常见
- nodeName:节点名称
- nodeType:节点类型
- nodeValue:节点的值
- childNodes:所有子节点
- appendChild:方法,用于添加子元素
<div class="box">我是一个盒子</div>
const divEl = document.querySelector("div");
console.log(divEl.nodeName);
console.log(divEl.nodeType);
console.log(divEl.nodeValue);
console.log(divEl.childNodes);
console.log(divEl.childNodes[0].nodeValue);
console.log(document.nodeName);
console.log(document.nodeType);
console.log(document.nodeValue);
console.log(document.childNodes);
每一种元素类型有对应的nodeType,比如 element_node 对应type为1,text_node 对应type为3,comment_node对应type为8,document_node对应type为9;而nodeValue只有文本类型的数据有。
document
document 是Document的实例对象,代表整个html页面,当页面被浏览器解析完成,就会创建一个document对象。
document 中有非常多的标签,当我们创建一个html页面时,至少会有以下内容。
所以它的属性和方法都和标签元素有关
- body:获取body标签
- title:获取文档标题
- head:获取head标签
- children:获取所有子元素,HTMLCollection
- location:和window.location一样,拿到的是url信息
常用方法包括了创建、删除、获取元素
- createElement:创建元素
- removeElement:移除元素
- appendChild:继承自Node的属性,添加子元素
- querySelector:通过id/name/tagName获取单个元素
- querySelectorAll:通过id/name/tagName获取多个元素
- getElementById:通过Id获取元素
- getElementsByName:通过Name获取元素
- getElementsByTagName:通过TagName获取元素
// html 代码
<body>
<p></p>
<p></p>
// js代码
<script type="text/javascript">
const divEl = document.createElement("div");
const pEl = document.getElementsByTagName("p")[0];
const divTags = document.querySelectorAll("div");
document.body.appendChild(divEl);
document.body.removeChild(pEl);
console.log(pEl);
console.log(divTags);
</script>
</body>
element
element与单个标签元素有关,指的是具体的dom元素,它有这些常用属性和方法
- chidren:子元素
- childNodes:继承自Node的属性,子节点
- tagName:标签名
- id:id属性
- className:类名
- classList:由类名组成的数组
- clientWidth:元素宽度
- clientHeight:元素高度
- clientLeft:边框宽度
- clientTop:边框高度
- offsetWidth:距离左侧边距
- offsetTop:距离右侧边距
- getAttribute:方法,用于获取元素的某个属性
- setAttribute:方法,用于设置元素的某个属性
// html代码
<div id="element" class="box content"></div>
// css代码
.box {
height: 200px;
width: 200px;
border: 10px solid #000;
}
// js代码
const divEl = document.querySelector("div");
console.log(divEl.children);
console.log(divEl.childNodes);
console.log(divEl.tagName);
console.log(divEl.id);
console.log(divEl.className);
console.log(divEl.classList);
console.log(divEl.clientWidth, divEl.clientHeight);
console.log(divEl.clientLeft, divEl.clientTop);
console.log(divEl.offsetLeft, divEl.offsetTop);
console.log(divEl.getAttribute("id"));
divEl.setAttribute("name", "alice");
用一张图来总结DOM的用法
从浏览器架构角度去了解BOM和DOM就能更好的掌握,从而自如使用,以上就是BOM和DOM相关内容,关于js高级,还有很多需要开发者掌握的地方,可以看看我写的其他博文,持续更新中~
从浏览器架构认识BOM和DOM的更多相关文章
- 浏览器中的BOM和DOM
BOM 浏览器对象模型 提供了独立于内容而与浏览器窗口进行交互的对象.描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本,对Cookie的支持 ...
- JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
一.JavaScript简介 JavaScript是一种解释执行的脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,它遵循ECMAScript标准.它的解释器被称为JavaScript引 ...
- 浏览器内核与BOM对象介绍
BOM(Browser Object Model)对象介绍 我们都知道js有三部分组成,ECMAScript.DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其它浏览器也是风 ...
- BOM,DOM,ECMAScripts三者的关系
一:DOM 文档对象模型(DOM)是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口(API) DOM是HTML与JavaScript之间沟通的桥梁. DOM下,HTM ...
- bom和dom总结
BOM1.1 介绍 1.BOM是browser object model的缩写,简称浏览器对象模型 2.BOM提供了独立于内容而与浏览器窗口进行交互的对象 3.由于BOM主要用 ...
- BOM和DOM的区别和关联
BOM 1. BOM是Browser Object Model的缩写,即浏览器对象模型. 2. BOM没有相关标准. 3. BOM的最根本对象是window. 从1可以看出来:BOM和浏览器关系密切. ...
- 浏览器对象模型(BOM,Browser Object Model)
本文内容 1.概述 2.windows与document 3.对话框 4.定时调用 5.URL解析与访问历史 6.浏览器和屏幕信息 ★概述 &q ...
- 实现JavaScript的组成----BOM和DOM
我们知道,一个完整的JavaScript的实现,需要由三部分组成:ECMAScript(核心),BOM(浏览器对象模型),DOM(文档对象模型). 今天主要学习BOM和DOM. BOM: BOM提供了 ...
- JavaScript的组成—ECMAScript、BOM和DOM
JavaScript 是一种基于 ECMAScript 规范的脚本语言,并在此基础上进行了自己的封装.ECMAScript 不是一种编程语言,仅仅是一种脚本语言规范,由欧洲计算机协会制定和发布,任 ...
- BOM和DOM详解
DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...
随机推荐
- nuxt下运行项目时内存溢出(out of memory)的一种情况
话不多说直接上代码: 如图,点红点的三行引入了一个组件,内容是同意注册协议的弹窗.但是在run dev的时候提示说内存溢出了(out of memory)...经过多方排查,定位到这个组件,警察叔叔就 ...
- 文心一言 VS chatgpt (16)-- 算法导论4.1 1~2题
一.当A的所有元素均为负数时,FIND-MAXIMUM-SUBARRAY返回什么? 文心一言: 当A的所有元素均为负数时,FIND-MAXIMUM-SUBARRAY返回-1. 这是因为在二进制中,当所 ...
- 音视频八股文(8)-- h264 AnnexB
NALU(Network Abstract Layer Unit) ⾳视频编码在流媒体和⽹络领域占有重要地位:流媒体编解码流程⼤致如下图所示: H264简介 H.264从1999年开始,到2003年形 ...
- 2023-03-30:用Go语言改写FFmpeg示例decode_audio.c,实现高效音频解码。
2023-03-30:用Go语言改写FFmpeg示例decode_audio.c,实现高效音频解码. 答案2023-03-30: 这个程序的主要功能是将 MP2 音频文件解码为 PCM 格式,并输出到 ...
- 2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多
2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多 ...
- vue全家桶进阶之路27:Vue.js 3.0的下载和安装
使用脚手架vue-cli创建vue3项目,创建前需要准备以下: 1.node.js环境 见:https://www.cnblogs.com/beichengshiqiao/p/17251233.htm ...
- 解决git 本地代码与远程仓库冲突问题
在使用协同开发难免会出现同时修改某个文件导致代码冲突的问题 * branch master -> FETCH_HEAD error: Your local changes to the foll ...
- js通过className删除元素
有时候难免需要使用js进行 dom 操作:如在删除地图feature时同时得清除提示框 这个就需要使用 .parentNode.removeChild(元素) let chArr = document ...
- Outlook无法启动一直显示“正在启动”的解决方法
缘起 今天早上打开电脑以后,就打开Outlook2016了,一直显示这个界面: 我没在意就干别的事了, 可以半个小时过去了,还是这个界面,我慌了. 解决方法 安全模式打开Outlook 按WIN + ...
- 小技巧 | 使用 mv 重命名文件无需两次键入文件名称
使用过 Bash 的童鞋都知道 mv 是一个可以用于文件改名的命令,而且使用这个命令修改文件名时我们需要输入两次文件名(旧名字和新名字). 如果有一种情况是只需要你改动文件名中的一个字母,而文件名又特 ...