HTML 文档的骨干是标签。
根据文档对象模型(DOM),每一个HTML标签都是一个对象,一样标签内的文本也是一个对象。所以这些对象均可经过 JavaScript 操做
若是文档中有空格(就像任何字符同样),那么它们将成为 DOM 中的文本节点,若是咱们删除它们,则不会有任何内容。
<head>
以前的空格和换行符被忽略
</body>
以后放置了一些东西,那么它会自动移动到 body 内部,由于 HTML 规范要求全部内容必须位于 内。因此 后面可能没有空格。css
一般再浏览器中的文本不会显示开头/结尾的空文本节点,标签之间也不会显示空文本节点。html
若是浏览器遇到格式不正确的HTML,在造成DOM是会自动修复它
如:
<html>
即便不在文档中,浏览器也会自动建立它node
按DOM规范,table 必须具备 <tbody>
,所以table中未使用<tbody>
造成DOM时会自动添加。数组
其它 节点:
注释不会以任何方式影响视觉表示,可是必须遵循一条规则 —— 若是HTML中有东西,那么它必须在DOM树中。
HTML中全部内容都是DOM的一部分,
注释是一个节点甚至<!DOCTYPE...>
也是一个节
DOM总有12种节点浏览器
全部对DOM的操做都是从document
对象开始,将这个对象赋予一个变量,对其进行修改操做app
DOM节点树能够经过 document
属性使用
顶端的节点对应<html>
而且 <html> = document.documentElement
而<body> = document.body
,<head> = document.head
docment.body
可能为null,若是将script
脚本放入 <head>
标签种,那么此脚本没法访问到document.body
,即为nulldom
childNodes
集合提供对全部子节点包括文本节点的访问,它看起来是一个数字,实际上只是一个可迭代的类数组对象,所以没有数组的方法
全部的Dom 集合节点都是只读的没法经过赋值来替换对应的节点
除小部分节点,几乎全部的DOM集合都是实时的,它们反应的是DOM的实时状态
不要是有 for...in
来遍历DOM集合,此方法会列出其全部的属性。
注意此属性只能访问到当前script
脚本以前对应的节点
能够经过elem.hasChildNodes()
来检测是否含有子节点性能
经过elem.parentNode
可访问当前节点的父节点
经过elem.previousSibling/elem.nextSibling
可访问对应节点的上/下兄弟节点code
parentElement 可能为null,由于其方法返回的是父元素节点,而parentNode返回的是任何类型的父节点,所以,document.documentElement.parentElement === null
htm
经过元素查找子元素若是子元素是一个集合将返回 HTMLCollection
类数组
let tb = documet.querySelector('table') let tbs = tb.tBodies // HTMLCollection [tbody] let trs =tbs.rows // HTMLCollection [tr,tr,tr,...] let tr1 = trs[0] tr1.sectionRowIndex //0 当前 tr 在集合中的位置 tr1.rowIndex // 1 当前 tr 在整张表中的 位置 let tds = tr1.cells // HTMLCollection [td,td,td,...] td[0].cellIndex //0 当前 td 在父元素 tr节点 中的位置
经过 document
中的方法 document.querySelectorAll
或elem.querySelectorAll
获取的元素集合将返回NodeList
类数组
getElement*
方法只能经过 document
对象调用
let divs = document.querySelectorAll('div') // NodeList(4) [div.Owen, div#modal, div.main, div] document.getElementsByTagName('div')//HTMLCollection [div.Owen]
elem.matches(css)
会检测 elem
是否匹配到给定的css选择器,返回 true 或 false
elem.closest(css)
此方法会查找css选择器匹配到的祖先HTML,包括自身,并返回最早找到的元素
elem.catains(dom)
判断 dom 是否为 elem 的后代,或等于elem,返回true 或false
全部的节点都继承自根节点 EventTarget
parentNode
、nextSibling
、previousSibling
、ChildNodes
等(只能读取 getter);文本节点 Text
,元素节点Element
,注释节点Comment
都继承自NodenextElementSibling
、children
、getElement*
、querySelector
等等,浏览器不只支持HTML,还支持 XML、SVG等,分别对应的基类 HTMLElement
、XMLElement
、SVGElement
用于存储节点的包装器,不会再浏览器中展现,须要经过插值方法才能展现包装器里面的内容
function creatEl(){ let frag = new DocumentFragment(); for (let i=1;i<4;i++) { let li = document.createElement('li') li.append(i) frag.append(li) } return frag } ul.append(creatEl())
elem.className
对应元素的类名,多个类目以空格分隔
ul.className // "class1 class2 ..."
同时还要一个 elem.classList
对象可访问类名,它以类数组的方式存在,同时具备 add/remove/toggle/contains
等方法
ul.classList // DOMTokenList(2) ["333", "444", value: "333 444"] ul.classList.add('class1') ul.classList.remove('class1') ul.classList.toggle('class1') // true 新增 ul.classList.toggle('class1') // false 去除 ul.classList.contains('class1') //false 是否包含
一般咱们使用 style.*
单独对样式属性进行修改,若是想要对多种样式进行调整可以使用 cssText
,此方法会直接替换以前的样式
ul.style.cssText = ` color: red ; background-color: skyblue; width: 20px; text-align: center;`
style 属性仅针对 style 属性值进行操做,没法读取css类中的属性值
<style> body {margin:20 auto;} </style> <script> document.body.style.margin // "" </script>
这时咱们须要使用 getComputedStyle(el,[,pseudo])
方法来获取对应的值
若是不传参或值无心义,将返回元素全部样式,其属性值都为解析值,如 font-size:1em
最后获取的可能为解析后的值"16px"
let res = getComputedStyle(document.body) res.marginTop // "20px" res.margin // 谷歌 "20px 0px" 在火狐中为 "" 所以访问确切属性值须使用完整属性名
<!DOCTYPE HTML>
上述的属性可能会有所不一样,这不是一个 JavaScript 的问题,但会影响到 JavaScript。pageXOffset/pageYOffset: 获取可视窗口移动的距离 没法设值
可经过 window.scrollBy, window.scrollTo, elem.scrollIntoView来滚动窗口
scrollBy(x,y)
:滚动页面至相对于如今位置的(x,y)位置scrollTo(x,y)
:滚动到页面相对于文档左上方的(x,y),位置,相似于 scrollTop/scrollLeft
elem.scrollIntoView(truly)
:若是 truly 为真则使 当前元素 滚动至窗口顶部,元素顶部与窗口顶部对齐,若是truly 为false,则当前元素底部与窗口底部对齐。若是禁止窗口滚动可以使 样式属性 overflow
值为 hidden
其全部属性都是以可视窗口左端(X)和顶部(Y)为起点
ul.getBoundingClientRect() /* DOMRect { bottom: 829.59375 // 元素底部的Y坐标 height: 210 // 元素真实高度 left: 0 // 元素左边 X 坐标 right: 1903 // 元素右边 X 坐标 top: 619.59375 // 元素顶部 Y 坐标 width: 1903 // 元素自身真实宽度即不包含滚动条 x: 0 y: 619.59375 } */
document.elementFromPoint(x,y)
返回可视窗口坐标(x,y),最顶层的元素
let elem = document.elementFromPoint(0,0) // <p>556666</p>
若是x,y
不在正常范围内将返回 null,
function getDomCoords(el){ let {top,left} = el.getBoundingClientRect() return { top:top+ window.pageYOffset, left:left+window.pageXOffest } }