一、 dom 介绍
HTML DOM (文档对象模型) {docsify-ignore}
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
HTML DOM 模型被构造为对象的树
通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。
- JavaScript 能够改变页面中的所有 HTML 元素
- JavaScript 能够改变页面中的所有 HTML 属性
- JavaScript 能够改变页面中的所有 CSS 样式
- JavaScript 能够对页面中的所有事件做出反应
DOM 节点
在 HTML DOM (Document Object Model) 中, 每个东西都是 节点 :
- 文档本身就是一个文档对象
- 所有 HTML 元素都是元素节点
- 所有 HTML 属性都是属性节点
- 插入到 HTML 元素文本是文本节点
- 注释是注释节点
二、 dom 查找
1. getElement 系列:
方法 | 描述 |
---|---|
document.getElementById("idName") | 返回带有指定 id 的第一个对象的引用。 |
document.getElementsByClassName("className") | 返回带有指定 class 的对象集合。 |
document.getElementsByTagName("p") | 返回带有指定标签名的对象集合。 |
document.getElementsByName("username") | 返回带有指定名称的对象的集合 |
返回一个节点或者一个类数组的节点集合,HTMLCollection
对象(动态的 NodeList 对象)
2. querySelector 系列:
方法 | 描述 |
---|---|
document.querySelector("p") | 获取文档中第一个 元素 |
document.querySelector("#id") | 获取文档中指定 id 的元素 |
document.querySelector(".class") | 获取文档中第一个指定 class 的对象 |
document.querySelector("input[type='text']") | 获取文档中有 type='text' 属性的第一个 元素: |
document.querySelectorAll("p") | 获取文档中所有 元素 |
document.querySelectorAll("#id") | 获取文档中所有指定 id 的元素 |
document.querySelectorAll(".class") | 获取文档中所有指定 class 的对象 |
document.querySelectorAll("input[type='text']") | 获取文档中有 type='text' 属性的所有 元素: |
3. getElement 和 querySelector
getElement
系列返回一个节点或者一个类数组的节点集合,HTMLCollection 对象(动态的 NodeList 对象)。动态的 Node List, 每一次调用 li 都会重新对文档进行查询,导致无限循环的问题。 querySelector
系列返回一个节点或者一个类数组的节点集合,静态 NodeList 对象。静态的 Node List,是一个 li 集合的快照,对文档的任何操作都不会对其产生影响。
什么是 NodeList?
本质上是一个动态的 Node 集合,只是规范中对 querySelectorAll
有明确要求,规定其必须返回一个静态的 NodeList 对象。
什么是 HTMLCollection?
HTMLCollection 和 NodeList 十分相似,都是一个动态的元素集合,每次访问都需要重新对文档进行查询。两者的本质上差别在于,HTMLCollection 是属于 Document Object Model HTML 规范,而 NodeList 属于 Document Object Model Core 规范。
4. 两者的区别
NodeList 对象会包含文档中的所有节点,如 Element
、Text
和 Comment
等。HTMLCollection 对象只会包含文档中的 Element
节点。另外,HTMLCollection 对象比 NodeList 对象 多提供了一个 namedItem
方法。
三、 dom document
以下是常用的 Document 对象属性和方法
属性 / 方法 | 描述 |
---|---|
document.body | 返回文档的 body 元素 |
document.createAttribute() | 创建一个属性节点 |
document.createElement() | 创建元素节点 |
document.createTextNode() | 创建文本节点 |
document.documentElement | 返回文档的根节点 |
document.documentURI | 设置或返回文档的位置 |
document.URL | 返回文档完整的 URL |
document.images | 返回对文档中所有 Image 对象引用 |
document.normalize() | 删除空文本节点,并连接相邻节点 |
document.renameNode() | 重命名元素或者属性节点。 |
document.scripts | 返回页面中所有脚本的集合。 |
document.write() | 向文档写 HTML 表达式 或 JavaScript 代码。 |
document.writeln() | 等同于 write() 方法,不同的是在每个表达式之后写一个换行符 |
四、 dom 元素
在 HTML DOM 中, 元素对象代表着一个 HTML 元素。
元素对象 的 子节点可以是, 可以是元素节点,文本节点,注释节点。
NodeList 对象 代表了节点列表,类似于 HTML 元素的子节点集合。
常用的 HTML 元素 的属性和方法
属性 / 方法 | 描述 |
---|---|
element.appendChild() | 为元素添加一个新的子元素 |
element.attributes | 返回一个元素的属性数组 |
element.childNodes | 返回元素的一个子节点的数组 |
element.children | 返回元素的子元素的集合 |
element.childElementCount | 返回子元素节点的个数 |
element.classList | 返回元素的类名,作为 DOMTokenList 对象。 |
element.className | 设置或返回元素的 class 属性 |
element.cloneNode() | 克隆某个元素 |
element.firstChild | 返回元素的第一个子节点 |
element.lastChild | 返回的最后一个子元素 |
element.focus() | 设置文档或元素获取焦点 |
element.getAttribute() | 返回指定元素的属性值 |
element.getAttributeNode() | 返回指定属性节点 |
element.hasAttribute() | 如果元素中存在指定的属性返回 true,否则返回 false。 |
element.hasAttributes() | 如果元素有任何属性返回 true,否则返回 false。 |
element.hasChildNodes() | 返回一个元素是否具有任何子元素 |
element.id | 设置或者返回元素的 id。 |
element.innerHTML | 设置或者返回元素的内容。 |
element.insertBefore() | 现有的子元素之前插入一个新的子元素 |
element.nextSibling | 返回该元素紧跟的一个节点 |
element.nextElementSibling | 返回指定元素之后的下一个兄弟元素(相同节点树层中的下一个元素节点)。 |
element.nodeName | 返回元素的标记名(大写) |
element.nodeType | 返回元素的节点类型 |
element.nodeValue | 返回元素的节点值 |
element.parentNode | 返回元素的父节点 |
element.previousSibling | 返回某个元素紧接之前元素 |
element.previousElementSibling | 返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)。 |
element.removeAttribute() | 从元素中删除指定的属性 |
element.removeAttributeNode() | 删除指定属性节点并返回移除后的节点。 |
element.remove() | 删除自身节点 |
element.removeChild() | 删除一个子元素 |
element.replaceChild() | 替换一个子元素 |
element.setAttribute() | 设置或者改变指定属性并指定值。 |
element.setAttributeNode() | 设置或者改变指定属性节点。 |
element.style | 设置或返回元素的样式属性 |
element.tabIndex | 设置或返回元素的标签顺序。 |
element.tagName | 作为一个字符串返回某个元素的标记名(大写) |
element.textContent | 设置或返回一个节点和它的文本内容 |
element.title | 设置或返回元素的 title 属性 |
element.toString() | 一个元素转换成字符串 |
nodelist.item() | 返回某个元素基于文档树的索引 |
nodelist.length | 返回节点列表的节点数目。 |
- nextSibling 属性返回元素节点之后的兄弟节点(包括文本节点、注释节点);
- nextElementSibling 属性只返回元素节点之后的兄弟元素节点(不包括文本节点、注释节点);
元素在页面的位置
属性 / 方法 | 描述 |
---|---|
element.clientHeight | 在页面上返回内容的可视高度(不包括边框,边距或滚动条) |
element.clientWidth | 在页面上返回内容的可视宽度(不包括边框,边距或滚动条) |
element.offsetHeight | 返回任何一个元素的高度包括边框和填充,但不是边距 |
element.offsetWidth | 返回元素的宽度,包括边框和填充,但不是边距 |
element.offsetLeft | 返回当前元素的相对水平偏移位置的偏移容器 |
element.offsetParent | 返回元素的偏移容器 |
element.offsetTop | 返回当前元素的相对垂直偏移位置的偏移容器 |
element.scrollHeight | 返回整个元素的高度(包括带滚动条的隐蔽的地方) |
element.scrollLeft | 返回当前视图中的实际元素的左边缘和左边缘之间的距离 |
element.scrollTop | 返回当前视图中的实际元素的顶部边缘和顶部边缘之间的距离 |
element.scrollWidth | 返回元素的整个宽度(包括带滚动条的隐蔽的地方) |
五、 dom 样式实例
p标签p标签p标签p标签
六、 dom 节点实例
- 1
- 2
- 3
- 4
- 5
;
var ul = document.querySelector("ul");
// 获取子节点 仅仅找儿子,不带任何条件
console.log("children", ul.children);
// 包含元素节点(标签)和文本节点
console.log("childNodes", ul.childNodes);
// 返回子元素节点的个数
console.log("childElementCount", ul.childElementCount);
// 获取第一个节点,包含文本节点
console.log(ul.firstChild);
// 获取第一个元素节点
var firstChild = ul.firstElementChild;
console.log("firstElementChild", ul.firstElementChild);
// 获取最后一个元素节点
console.log("lastElementChild", ul.lastElementChild);
// 控制下一个兄弟
console.log("下一个", firstChild.nextElementSibling);
console.log("上一个", ul.lastElementChild.previousElementSibling);
// innerText 元素里的文本
firstChild.innerText = "111222
";
// 如果字符串里面包含html代码,则会渲染成html的结构
// 通常用作字符串模板
firstChild.innerHTML = "111222
";
// 连标签本身也会被替代掉
firstChild.outerHTML = "h1标签
";
firstChild.outerText = "h1标签
";
// 找父节点
console.log("parentElement", firstChild.parentElement);