浏览器架构

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的更多相关文章

  1. 浏览器中的BOM和DOM

    BOM 浏览器对象模型 提供了独立于内容而与浏览器窗口进行交互的对象.描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本,对Cookie的支持 ...

  2. JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)

    一.JavaScript简介 JavaScript是一种解释执行的脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,它遵循ECMAScript标准.它的解释器被称为JavaScript引 ...

  3. 浏览器内核与BOM对象介绍

    BOM(Browser Object Model)对象介绍 我们都知道js有三部分组成,ECMAScript.DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其它浏览器也是风 ...

  4. BOM,DOM,ECMAScripts三者的关系

    一:DOM 文档对象模型(DOM)是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口(API) DOM是HTML与JavaScript之间沟通的桥梁.   DOM下,HTM ...

  5. bom和dom总结

    BOM1.1    介绍    1.BOM是browser object model的缩写,简称浏览器对象模型    2.BOM提供了独立于内容而与浏览器窗口进行交互的对象    3.由于BOM主要用 ...

  6. BOM和DOM的区别和关联

    BOM 1. BOM是Browser Object Model的缩写,即浏览器对象模型. 2. BOM没有相关标准. 3. BOM的最根本对象是window. 从1可以看出来:BOM和浏览器关系密切. ...

  7. 浏览器对象模型(BOM,Browser Object Model)

    本文内容     1.概述     2.windows与document     3.对话框     4.定时调用     5.URL解析与访问历史     6.浏览器和屏幕信息 ★概述     &q ...

  8. 实现JavaScript的组成----BOM和DOM

    我们知道,一个完整的JavaScript的实现,需要由三部分组成:ECMAScript(核心),BOM(浏览器对象模型),DOM(文档对象模型). 今天主要学习BOM和DOM. BOM: BOM提供了 ...

  9. JavaScript的组成—ECMAScript、BOM和DOM

      JavaScript 是一种基于 ECMAScript 规范的脚本语言,并在此基础上进行了自己的封装.ECMAScript 不是一种编程语言,仅仅是一种脚本语言规范,由欧洲计算机协会制定和发布,任 ...

  10. BOM和DOM详解

    DOM介绍 D(文档)可以理解为整个Web加载的网页文档,O(对象)可以理解为类似window对象只来的东西,可以调用属性和方法,这里我们说的是document对象,M(模型)可以理解为网页文档的树形 ...

随机推荐

  1. Prism Sample 9 ChangeConvention

    上个例子跳过了ViewModelLocator,因是采用约定的方式最为方便. 如果有人要修改约定,自定义view和viewModel的默认自动定位方式,怎么办呢? 在app.xaml.cs重写以下方法 ...

  2. flutter系列之:做一个修改组件属性的动画

    目录 简介 flutter中的动画widget AnimatedContainers使用举例 总结 简介 什么是动画呢?动画实际上就是不同的图片连续起来形成的.flutter为我们提供了一个Anima ...

  3. python库Munch的使用记录

    开头 日常操作字典发现发现并不是很便利,特别是需要用很多 get('xxx','-') 的使用,就觉得很烦,偶然看到Kuls大佬公众号发布的一篇技术文有对 python munch库的使用, 使得字典 ...

  4. 项目打包后配置到node服务器

    1.将项目进行打包 npm run build项目根目录下会多出一个打包好的由.js .html .css文件组成的dist文件夹,如图 2.搭建node微型服务器   新建文件夹命名"no ...

  5. 2020-09-15:java里的wait()和sleep()的区别有哪些?

    福哥答案2020-09-15:#福大大架构师每日一题# 1.线程状态.wait()的线程状态是TimedWaiting和Waiting.sleep()的线程状态是Waiting.2.指定时间.wait ...

  6. 2020-01-04:mysql里的innodb引擎的数据结构,你有看过吗?

    福哥答案2020-01-04: 面试官刚开始问我看过mysql源码没,然后问了这个问题.回答B+树,过不了面试官那关.答案来自<MySQL技术内幕 InnoDB存储引擎 第2版>第四章,时 ...

  7. 2021-09-25:给定一个字符串数组,将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词指字母相同,但排列不同的字符串。示例 1:输入: strs = [“eat“, “tea“, “

    2021-09-25:给定一个字符串数组,将字母异位词组合在一起.可以按任意顺序返回结果列表.字母异位词指字母相同,但排列不同的字符串.示例 1:输入: strs = ["eat" ...

  8. java通用xls导出设计

    背景 在后端日常开发中总会有各种各样的导出需求,实现这个需求必须要解决的两个问题: 1.表头不能直接使用字段名,需要显示为中文,甚至还需要考虑国际化 2.值需要翻译,比如性别.状态之类的字段 现状 现 ...

  9. 最详细的Git命令大全

    Git常用命令及方法大全 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) R ...

  10. Python基础 - 运算符优先级

    以下表格列出了从最高到最低优先级的所有运算符: 运算符 描述 ** 指数 (最高优先级) ~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) * / % // 乘,除,取模 ...