只写一些DOM2和DOM3中我目前能用到的点,更多细节会以后补上
一.DOM变化
1.DOM2级为不同的DOM类型引入了一些与XML命名空间有关的方法(对HTML文档没有实际意义)。
2.定义了以编程方式创建Document实例的方法
3.支持创建DocumentType对象
二.样式
测试浏览器是否支持DOM2级定义的CSS能力
var supportsDOM2CSS2=document.implementation.hasFeature(“CSS2”,"2.0”);
1.访问元素的内联样式
HTML元素的style特性中的信息分别对应JS中style对象的属性。这个style对象只包含内联样式的信息。使用短划线(如background-image)的CSS属性名,要转换成驼峰大小写形式才能通过JS来访问(style.backgroundImage)。
有一个特殊的CSS属性:float属性,要转换成cssFloat
<div id="myDiv" style="background-color:blue; 10px; height:20px"></div> //取得样式 var myDiv=document.getElementById("myDiv"); //首先取得元素的引用 alert(myDiv.style.width); //"10px" //修改样式 myDiv.style.width="20px";
(1)style对象的属性和方法
style对象是CSSStyleDeclaration的实例,类似于一个数组
cssText
length
getPropertyValue()
item() []
removeProperty()
setProperty(propertyName,value,priority) //设置属性,并设置!important
//cssText在元素有多项变化时使用 myDiv.style.cssText="20px; height:30px; background-color:red";
//getPropertyValue()通过属性名取得属性值 var property,i,len,value for(i=0,len=myDiv.style.length;i<len;i++){ property=myDiv.style[i]; value=myDiv.style.getPropertyValue(property); alert(property+":"+value); }
//移除属性 myDiv.style.removeProperty("border");
(2).计算的样式(所有样式信息)
document.defaultView.getComputedStyle(元素,伪元素的字符串)
var computedStyle=document.defaultView.getComputedStyle(myDiv,null); alert(computedStyle.width); //
IE中类似的属性:style.currentStyle
注:所有计算的样式都是只读的,不能修改计算后样式对象中的CSS属性
2.操作样式表
CSSStyleSheet类型表示样式表,继承自StyleSheet,包括外部样式表和内部样式表。为只读
测试是否支持DOM2级样式表:
var supportDOM2StyleSheets=document.implementation.hasFeature(“StyleSheets”,"2.0”);
document.styleSheets表示文档中所有样式表。也可以直接通过<link><style>元素取得CSSStyleSheet对象,用sheet或styleSheet属性
//取得样式表对象 function getStyleSheet(element){ return element.sheet||element.styleSheet; } //取得第一个<link>元素引入的样式表 var link =document.getElementsByTagName("link")[0]; var sheet=getStylesheet(link);
(1)访问和修改CSS样式表
CSSRule对象表示样式表中的每一条规则,是一个基类型。CSSStyleRule类型继承自CSSRule,表示样式信息。常用属性:
cssText:与style.cssText属性类似,前者包含选择符文本和花括号,后者只包含样式信息。前者为只读,后者可重写
selectorText
style
影响符合该规则的所有元素:
div.box{ background-color:blue; 100px; height:200px; } //假设这条规则位于页面中第一个样式表中,且只有这一条样式规则 var sheet=document.styleSheets[0]; //取得第一个样式表的引用 var rules=sheet.cssRules||sheet.rules; //取得表中的每一条规则 var rule=reles[0]; //取得第一条规则 alert(rule.style.width); //"100px" rule.style.backgroundColor="red" //修改样式信息
(2)向样式表中添加新规则
insertRule(规则文本,插入规则的索引) IE:addRule(“body”,"background-color:silver“,0)
夸浏览器向样式表插入规则:
function insertRule(sheet,selecorText,cssText,position){ if(sheet.insertRule){ sheet.insertRule(selectorText+"{"+cssText+"}",position); }else if(sheet.addRule){ sheet.addRule(selectorText,cssText,position); } } insertRule(document.styleSheet[0],"body","background-color:red",0);
(3)删除
deleteRule() removeRule()
夸浏览器:
function deleteRule(sheet,index){ if(sheet.deleteRule){ sheet.deleteRule(index); }else if(sheet.removeRule){ sheet.removeRule(index); } } deleteRule(document.styleSheets[0],0); //删除第一条规则
3.元素大小
(1)偏移量
偏移量:元素在屏幕上占用的所有可见的空间
offsetHeight
offsetWidth
offsetLeft
offsetTop
offsetParent
计算绝对位置:
//左偏移量 function getElementLeft(element){ var actualLeft=element.offsetLeft; var current=element.offsetParent; while(current!==null){ actualLeft+=current.offsetLeft; current=current.offsetParent; } return actualLeft; } //上偏移量 function getElementTop(Top){ var actualTop=element.offsetTop; var current=element.offsetParent; while(current!==null){ actualTop+=current.offsetTop; current=current.offsetParent; } return actualTop; }
一般来说,通过getElementLeft()和getElementTop()会返回与offsetLeft和offsetTop相同的值
(2)客户区大小
客户区大小:元素内容及其内边距所占据的空间大小
clientWidth
clientHeight
多用于确定浏览器视口大小:
function getViewport(){ if(document.compatMode=="BackCompat"){ return { document.body.clientWidth, document.body.clientHeight }; }else{ return { document.documentElement.clientWidth, height:document.documentElement.clientHeight }; } }
(3)滚动大小
滚动大小:包含滚动内容的元素的大小
scrollHeight:元素内容的总高度(实际大小)
scrollWidth:元素内容的总宽度
scrollLeft:被隐藏在内容区域左侧的像素数
scrollTop:被隐藏在内容区上边的像素数
夸浏览器取得滚动文档的总高度:
var docHeight=Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight); var docWidth=Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth);
设置元素的滚动位置:
function scrollToTop(element){ if(element.scrollTop!=0){ element.scrollTop=0; } }
(4)确定元素的大小
getBoundingClientRect()方法,有4个属性:left,top,right,bottom.给出了元素在页面中相对视口的位置
//兼容性问题再看
三.遍历
1.NodeIterator
document.createNodeIterator()
4个参数:
root:搜索起点
whatToShow:NodeFilter对象
filter:可以自定义NodeFilter对象
entityReferenceExpansion:布尔值,表示是否要扩展实体引用。??
<div id="div1"> <p><b>hello</b>world</p> <ul> <li>list1</li> <li>list2</li> <li>list3</li> </ul> </div> //遍历div元素中所有元素 var div=document.getElementById("div1"); var iterator=document.createNodeIterator(div,NodeFilter.SHOW_ELEMENT,null,false); var node=iterator.nextNode(); while(node!=null){ alert(node.tagName); node=iterator.nextNode(); } //只遍历li元素 var div=document.getElementById("div1"); var filter=function(node){ return node.tagName.toLowerCase()=="li"?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP; }; var iterator=document.createNodeIterator(div,NodeFilter.SHOW_ELEMENT,filter,false); var node=iterator.nextNode(); while(node!=null){ alert(node.tagName); node=iterator.nextNode(); }
(2)TreeWalker
比NodeIterator更高级。NodeIterator值允许以一个节点的步幅前后移动,而TreeWalker还支持DOM节后的各个方向上移动,包括父节点,同辈节点和子节点等方向。
//例如上边的只遍历li元素 var div=document.getElementById("div1"); var walker=document.createTreeWalker(div,NodeFilter.SHOW_ELEMENT,null,false); walker.firstChild(); //转到<p> walker.nextSibling(); //转到<ul> var node=walker.firstChild(); //转到第一个<li> while(node=!null){ alert(node.tagName); node=walker.nextSibling(); }
四.范围
范围是选择DOM结构中特定的部分,然后执行相应操作的一种手段
使用范围选区可以在删除文档中某些部分的同时,保持文档结构的格式良好,过着复制文档中的相应部分。
1.DOM中的范围
2.IE8及更早版本中的范围
IE8及更早版本不支持“DOM2级遍历和范围”模块,但它提供了一个专有的文本范围对象,可以用来完成简单的基于文本的范围操作。IE9完全支持DOM遍历。