DOM 是载入到浏览器中的文档模型,它用节点树的形式来表现文档,每一个节点表明文档的构成部分(例如: element——页面元素、字符串或注释等等)。css
DOM 是Web——万维网上使用最为普遍的API之一,由于它容许运行在浏览器中的代码访问文件中的节点并与之交互。节点能够被建立,移动或修改。事件监听器能够被添加到节点上并在给定事件发生时触发。html
方法 | 描述 |
---|---|
getElementById() | 返回带有指定 ID 的元素。 |
getElementsByTagName() | 返回包含带有指定标签名称的全部元素的节点列表(集合/节点数组)。 |
getElementsByClassName() | 返回包含带有指定类名的全部元素的节点列表。 |
appendChild() | 把新的子节点添加到指定节点。 |
removeChild() | 删除子节点。 |
replaceChild() | 替换子节点。 |
insertBefore() | 在指定的子节点前面插入新的子节点。 |
createAttribute() | 建立属性节点。 |
createElement() | 建立元素节点。 |
createTextNode() | 建立文本节点。 |
getAttribute() | 返回指定的属性值。 |
setAttribute() | 把指定属性设置或修改成指定的值。 |
查询(得到Dom节点)--------- document.getElementById() //经过ID号查找元素 document.getElementsByTagName() //经过标签名称查找元素 document.getElementsByName() //经过name属性来查找元素
document.querySelectorAll // 返回与指定的选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)
document.querySelector //返回文档中与指定选择器或选择器组匹配的第一个 html元素Element。 若是找不到匹配项,则返回。
IE8如下 不支持如下方法, document.getElementsByClassName() //经过class属性来查找元素、设置某元素的class时:某元素.className="active" document.querySelector(selector) //selector是一个字符串,包含一个或是多个 CSS 选择器 ,多个则以逗号分隔。 document.querySelectorAll()null
除getElementById(),其余的获取方法获得的都是伪数组(具备数组的一些特性,如:length属性,有索引值1.2.3...,但不能使用数组的方法),将伪数组转为数组:html5
http://www.cnblogs.com/fanlinqiang/p/7741236.htmlnode
getElementsByClassName()兼容性处理以下:web
document.createElement() // 建立一个DOM元素 (document.createTextNode();//插入内容中的标签不会被解析) _parentNode.appendChild(target) // 将target元素追加到box元素的内部,此时浏览器才能正确加载并显示元素 _parentNode.insertBefore(newnode, oldnode) //将newnode元素插入到parent元素的内部,同时放在oldnode元素的前面 _node.cloneNode(deep)//克隆一个节点,deep设置为 true,若是您须要克隆节点及其属性,以及后代;设置为 false,若是您只须要克隆节点及其后代
_parentNode.removeChild(child) // 将child元素删除,parent是child元素的父亲 _node.remove(); // 非w3c标准,但大部分浏览器都支持
_node.style.background = 'red'
_node.style.backgroundColor = 'red'
_node.style.cssFloat = 'left'
获取一个自定义属性的值(在IE8中可box.index直接取) box.getAttribute("index") // 修改 box.index = 99; box.setAttribute("index",99) //会在html中生成属性index
tips:在js中 直接定义box.index=i box.index 存取index值,但不会在html标签中生成index属性数组
在html5中提供了为dom元素提供了dataSet属性,能够轻松得到绑定在dom元素中data-*的属性值,如:浏览器
<img id="test" src="" data-url='http://www.cnblogs.com/fanlinqiang/icon' /> .... var img = document.getElementById('test') img.setAttribute('src',img.dataset.url)
若非行内样式 doc.style.height 为空,此时对于非行内样式的操做(可修改不可读取) ,获取非行间样式兼容性操做,以下:缓存
function getStyle(obj, attr) { return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj, false)[attr]; // 火狐 }
比较重要的节点类型有:app
元素类型 | NodeType |
---|---|
元素 | 1 |
属性 | 2 |
文本 | 3 |
注释 | 8 |
文档 | 9 |
parentNode //获取父节点 childNodes //获取全部子节点 IE7及如下自动过滤文本节点 children //获取全部子标签(非W3C标准,但几乎全部浏览器都支持) previousSibling //前一个兄弟节点 nextSibling //后一个兄弟节点 previousElementSibling // 前一个兄弟元素(非W3C标准) nextElementSibling // 后一个兄弟元素(非W3C标准)
function getElementChildren(obj){ var list = obj.childNodes; var res = []; for(var i=0; i<list.length; i++){ if(list[i].nodeType == 1 ){ res.push(list[i]); } } return res; }
高级操做----位置、大小计算dom
offsetWidth ((content+padding+border)) // clientWidth (padding+width-滚动条) //计算元素的可视宽度 offsetHeight (只读)// clientHeight 计算元素的可视高度 innerWidth //内部可视宽度 innerHeight // 在Google中 window.innerWidth=window.clientWidth,在火狐中window.clientWidth包括右边滚动条 ele.offsetLeft //计算元素相对于参照物的位置(有定位的父元素) offsetLeft = left + marginLeft ele.offsetTop //计算元素相对于参照物的位置(有定位的父元素) //获取参照物父元素 offsetParent 获取参照物父元素,获取有定位的父元素
获取页面元素相对于窗口的绝对位置:
function offsetPage(obj){ var _left=0; var _top=0; while(obj){ _left+=obj.offsetWidth; _top+=obj.offsetHeight; obj=obj.offsetParent; } return {"left":_left,"top":_top}; }
获取某个子节点相对于父元素的位置
function offsetParent (parentNode, currentNode) { let left = 0; let top = 0; while (currentNode) { left += currentNode.offsetWidth; top += currentNode.offsetHeight; if (currentNode === parentNode) { break; } currentNode = currentNode.offsetParent; } return {left, top}; }
element.scrollIntoView( [Boolean | Options]); //让当前的元素滚动到浏览器窗口的可视区域内。https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView
Boolean型参数 :若是为true
,元素的顶端将和其所在滚动区的可视区域的顶端对齐。若是为false,
元素的底端将和其所在滚动区的可视区域的底端对齐。
Options型参数:
{ behavior: "auto" | "instant" | "smooth", // 定义动画,默认为 "auto"。 block: "start" | "center" | "end" | "nearest", // 与可视区域对齐的方式,默认为 "center"。 inline: "start" | "center" | "end" | "nearest", // 默认为 "nearest"。 }
innerHTML 和 innerText 区别?
box.innerHTML(".......")插入的标签会被浏览器编译 box.innerText(".........")插入的仅是文本,标签不会被浏览器解析var txt = document.createTextNode("nihao"); document.body.appendChild(txt);
(与计算机的缓存的概念相似,减小IO次数,保护硬盘,每次使用dom操做时会使整个页面产生热reflow、repain,其中的开销是极大的)
var t1 = new Date().getTime(); for(var i=0; i<10000; i++) { var oP = document.createElement("p") oP.innerHTML = "a"; document.body.appendChild(oP); } var t2 = new Date().getTime(); console.log(t2-t1); var t3 = new Date().getTime(); var frag = document.createDocumentFragment(); for(var i=0; i<10000; i++) { var oP = document.createElement("p") oP.innerHTML = "a"; frag.appendChild(oP); //appendChild 是个异步方法 } document.body.appendChild(frag); var t4 = new Date().getTime(); console.log(t4-t3);