【第5章】dom、bom


一、dom

前言:dom的本质

html是一种特定的xml,html规定了语法,而xml可以自己规定标签
dom的本质是一个树形的数据结构

1. document对象

(1)document对象集合

all[]所有元素的集合
anchors[]对所有href链接的引用,非常简单地返回文档中具有name属性值的所有锚点的集合。已被web标准删除。
applets对所有applets(小应用程序)对象的引用
forms[]对所有forms的引用
images[]对所有img的引用
links[]对所有area的href的引用,href

(2)document对象属性
1
2
3
4
5
6
cookie     
domain (域名,'www.baidu.com')
lastModified(返回文档被最后修改的日期和时间。)
referrer(从哪里跳转来的。返回"载入"当前文档的文档的 URL。这个比较常用)'https://www.baidu.com/from=844b/s?word=sdfsdf'
title(返回当前文档的标题。)
URL(当前文档url,和location.href的区别:URL不可设置,location.href可以设置)
(3)document对象方法
1
2
3
4
5
6
7
8
9
document.querySelector()
document.getElementById()
document.getElementsByName()
document.getElementsByClassname()
document.getElementsByTagName()
document.createElement()
document.createTextNode()
document.createAttribute()
document.open()

2. document.element

(1)节点操作
1
2
3
4
5
6
7
8
element.getElementsByTagName()
element.appendChild() 在元素末尾添加新结点
element.insertBefore(新节点,指定子节点) 在指定的已有的子节点之前插入新节点。
element.cloneNode(deep) 复制元素 要连后代一起复制请把 deep 参数设置 true,否则设置为 false。
element.hasChildNodes() 有子节点返回true
element.normalize() 合并元素中相邻的文本节点,删除空的文本节点
element.replaceChild(newchild,oldchild) 用newchild替换元素中的某个oldchlid了
element.removeChild(node) 删除元素中的某个子元素node
(2)节点属性操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
element.attributes 
//返回属性数组
element.getAttribute()
//返回元素节点的指定属性值。 <a href = 'abc'></a> a.getAttribute('href')--->abc
element.getAttributeNode(name) let atr = document.querySelector('a').getAttributeNode('href')
//返回指定的属性节点。 <a href = 'abc'></a> a.getAttribute('href')--->href = 'abc' a.getAttribute('href').value ---> abc a.getAttribute('href').name--->href
element.hasAttribute(name)
// 如果元素拥有指定属性,则返回true,否则返回 false。
element.hasAttributes()
// 如果元素拥有属性,则返回 true,否则返回 false。
element.setAttribute(name,value) a.setAttribute('href','http://xxx.cn')
element.setAttributeNode()//用来设置已经创建的attribute节点
/*
// 用法
let div = document.createElement('div')
let attr = document.createAttribute('attr')
attr.value = '1'
div.setAttributeNode(attr)
div // <div attr = "1"></div>
*/
let newAtrNode = document.createAttribute('class') newAtrNode.nodeValue='abc' newNode.setAttributeNode(newAtrNode)
element.removeAttribute(name)
element.removeAttributeNode() // let atr = document.querySelector('a').getAttributeNode('href') document.querySelector('a').removeAttribute(atr)
element.style.xxx 获取元素内联的样式(style = "??????"),也可以通过它进行设置
element.className
(3)节点属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
element.childNodes  返回元素子节点的nodelists
element.className 返回元素类名
element.innerHTML
element.id
element.firstChild 返回元素的首个子元素
element.lastChild 返回元素的最后一个子元素
element.firstElementChild element.lastElementChild 返回元素的最后一个子标签元素
element.nodeType 1 元素 2 属性 3 文本 8 注释
element.nodeValue 元素节点的 nodeValue 是 undefined 或 null 文本节点的 nodeValue 是文本自身 属性节点的 nodeValue 是属性的值
element.nextSibling 当前节点的下一个节点(同一树层级)
element.previousSibling 当前节点的上一个节点(同一树层级)
element.innerHTML element.innerText
element.clientHeight element.clientWidth 返回元素的可见高度可见宽度(要减去滚动条滚动过的高度)
element.offsetWidth element.offsetHeight 返回元素的高度宽度(元素本身的高度宽度,包括边框,不受滚动条影响)
element.offsetTop element.offsetLeft // 元素距上层元素的高度/宽度,不受滚动条影响的
element.scrollTop element.scrollLeft // 滚动的高度/宽度
element.offsetParent 返回元素的偏移容器,不会是div

3.attribute 在属性节点上的可用的属性或方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
attr.isId 属性是id返回true反之false
attr.name 属性名称 btn.attributes[0].name,只读
attr.value 属性值 btn.attributes[0].value
nodemap就是element.attributes ~
nodemap.getNamedItem() // // 通过名称获取指定属性
nodemap.item(num) // 返回nodemap的指定位置属性
nodemap.length // 返回nodemap长度
nodemap.removeNamedItem(num) // 移出指定位置属性
nodemap.setNamedItem() // 通过名称设置指定属性

// var btn=document.getElementsByTagName("h1")[0];
// var typ=document.createAttribute("class");
// typ.nodeValue="democlass";
// btn.attributes.setNamedItem(typ);

4.event

(1)基本写法
1
2
3
document.querySelector('body').addEventListener('click',()=>{
alert(1)
})
(2)事件类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
onabort 图像的加载被中断。
onreset 重置按钮被点击。
onselect 文本被选中。
onunload 用户退出页面。
onchange 域的内容被改变。(input textarea)
onkeydown onkeypress onkeyup
onload 一张页面或一幅图像完成加载。
onmousedown onmousemove onmouseout onmouseover onmouseup

// altKey ctrlKey metaKey shiftKey clientX clientY screenX screenY clientX clientY
// currentTarget target type(返回当前 Event 对象表示的事件的名称。)
// preventDefault() 阻止默认事件 stopPropagation()停止冒泡

// 捕获比冒泡先执行,从内到外冒泡,从外到内捕获 addEventListener第三个参数默认为false 即冒泡 true 即捕获

二、bom

(1)window下

history
back()、forward()、go(n)
location

http://localhost:8080/axiospage?name=aaa&age=12#abc举例

1
2
3
4
5
6
7
8
9
10
11
hash(#后)   //'#abc'
host // localhost:8080
hostname //localhost
href //'http://localhost:8080/axiospage?name=aaa&age=12#abc'
pathname(纯路径无#无?)'/axiospage'
port //'8080'
protocol //'http:'
search(?后) //'?name=aaa&age=12'
assign(url)替换新url,会存储在当前历史中,和href作用一样。
reload()重新载入,为true时绕过缓存载入文档,为false或无参数则从缓存加载大概
replace(newUrl) (不会存储在历史跳转中,替换了当前)

Navigator下的属性基本是浏览器的各种信息,如userAgent返回由客户机发送服务器的 user-agent 头部的值。

其他常用的:
1
2
3
4
5
6
7
pageXOffset、pageYOffset	 
innerheight、innerwidth(无border margin)
outerheight、outerwidth(加border margin)
self(相当于window)
Screen
返回屏幕信息,分辨率、大小、英寸、像素 availHeight availWidth deviceXDPI deviceYDPI height width pixelDepth 等等
requestAnimationFrame

面试题:

如何提高dom性能?

(1) 避免频繁的dom操作
(2) 对dom查询做缓存
(3) 将dom频繁操作改为一次性操作