浏览器架构
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高级,还有很多须要开发者把握的中央,能够看看我写的其余博文,继续更新中~