第十二章 DOM2和DOM3
一.DOM变化
1.针对XML命名空间的变化
2.其他方面的变化
二.样式
1.访问元素的样式
.style
1)DOM样式属性方法
cssText:访问style特性中的CSS代码
length:应用给元素的CSS属性数量
parentRule:表示CSSRule对象
getPropertyCSSValue(propertyName):返回包含给定属性值的CSSValue对象
getPropertyPriority(propertyName):如果给定的属性使用了!important设置,则返回"important";否则,返回空字符串
getPropertyVlue(propertyName):返回给定属性的字符串值
item(index):返回给定位置的CSS属性的名称
removeProperty(propertyName):从样式中删除给定属性
setProperty(propertyName,value,priority):将给定属性设置哦为相应的值,并加上有限标志(“important”或者一个空字符串)
-cssText:
myDiv.style.cssText="width:25px;height:100px;background-color:green";
alert(myDiv.style.cssText);
//为元素应用多项变化的快捷方式
-length:
for( var i=0,len=myDiv.style.length;i<len;i++)
{
alert(myDiv.style[i]);//或者myDiv.style.item(i)
}
2)计算的样式
2.操作样式表
CSSStyleSheet类型表示的是样式表
1)css规则
CSSStyleRule对象:
div.box{
background-color:blue;
width:100px;
height:200px;
}
var sheet =docuemnt.styleSheets[0];
var rules=sheet.cssRules || sheet.rules;//取得规则列表
var rules = rules[0];//取得第一条规则
alert(rule.selectorText);//"div.box"
alert(rule.style.cssText);//完整的CSS代码
alert(rule.style.backgroundColor);//"blue"
alert(rule.style.width);//"100px"
alert(rule.style.height);//"200px"
2)创建规则
要向现有样式表中添加新规则,需要使用inserRule()方法:两个参数:规则文本和在哪里插入规则的索引
sheet.insertRule("body{background-color:silver}",0);//DOM方法
3)删除规则
deleteRule(); 一个参数:要删除的位置
sheet.deleteRule(0);//DOM方法
sheet.removeRule(0);//仅对IE有效
3.元素大小
1)偏移量:
offsetHeight、 offsetTop、 offsetWidth、 offsetlLeft。
2)客户区大小:元素内容及其内边距所占空间的大小
clientWidth、 clientHeight。
3)滚动大小
4).确定元素大小
function getElementLeft(element){
var actualLeft = element.offsetLeft;
var current = element.offsetParent;
while (current !== null){
actualLeft += current.offsetLeft;
current = current.offsetParent;
}
return actualLeft;
}
function getElementTop(element){
var actualTop = element.offsetTop;
var current = element.offsetParent;
while (current !== null){
actualTop += current. offsetTop;
current = current.offsetParent;
}
return actualTop;
}
function getBoundingClientRect(element){
var scrollTop = document.documentElement.scrollTop;
var scrollLeft = document.documentElement.scrollLeft;
if (element.getBoundingClientRect){
if (typeof arguments.callee.offset != "number"){
var temp = document.createElement("div");
temp.style.cssText = "position:absolute;left:0;top:0;";
document.body.appendChild(temp);
arguments.callee.offset = -temp.getBoundingClientRect().top - scrollTop;
document.body.removeChild(temp);
temp = null;
}
var rect = element.getBoundingClientRect();
var offset = arguments.callee.offset;
return {
left: rect.left + offset,
right: rect.right + offset,
top: rect.top + offset,
bottom: rect.bottom + offset
};
} else {
var actualLeft = getElementLeft(element);
var actualTop = getElementTop(element);
return {
left: actualLeft - scrollLeft,
right: actualLeft + element.offsetWidth - scrollLeft,
top: actualTop - scrollTop,
bottom: actualTop + element.offsetHeight - scrollTop
}
}
}
function getDimensions(){
var rect = getBoundingClientRect(document.getElementById("myDiv"));
alert("left: " + rect.left + "\nright: " + rect.right + "\ntop: " + rect.top + "\nbottom: " + rect.bottom);
}
</script>
</head>
<body style="padding: 10px; margin: 0">
<div style="margin: 20px">
<div style="padding: 20px">
<div id="myDiv" style="width: 100px; height: 50px; background-color: red; border: 1px solid black"></div>
</div>
</div>
<input type="button" value="Get Element Dimensions" onclick="getDimensions()" />
</body>
三.遍历
ie不支持dom遍历
*深度优先遍历0
检测浏览器对DOM2级遍历能力的支持情况
var supportsTraversals=docuemnt.implementation.hasFeature("Traversal","2.0");
var supportsNodeIterator=(typeof document.creatNodeIterator=="function");
var supportsTreeWalker=(typeof docuemnt.creatTreeWalker=="function");
1.NodeIterator
document.creatNodeIterator()方法创建实例
接受参数:
root:想要作为搜索起点的树中的节点
whatToShow:想要访问哪些节点的数字代码
filter:是一个NodeFilter对象,或者一个表示应该接受还是拒绝某种特定节点的函数
entityReferenceExpansion:布尔值,表示是否要扩展实体引用。用这个参数在HTML页面中没有用,因为其中的实体引用不能扩展。
eg .
<div id=" div1">
<p><b>hello</b>world!</p>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
想要遍历<div>元素中的所有元素:
var div=document.getElementById("div1");
var iterator=docuemnt.creatNodeIterator(div,NodeFilter.SHOW_ELEMENT,null,false);
var node=iterator.nextNode();
while(node!=null){
alert(node.tagname);//输出标签名
node=iterator.nextNode();
}
若只想要返回<li>元素:
<head>
<title>NodeIterator Example</title>
<script type="text/javascript">
function makeList() {
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);
//For Firefox: iterator = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, filter, false);
var output = document.getElementById("text1");
var node = iterator.nextNode();
while (node !== null) {
output.value += node.tagName + "\n";
node = iterator.nextNode();
}
}
</script>
</head>
<body>
<p><strong>Note:</strong> The <code>NodeIterator</code> object has only been implemented in Internet Explorer 9, Chrome, Firefox (version 3.5 and higher), Opera (version 7.6 and higher) and Safari (version 1.3 and higher). It has not been implemented in Internet Explorer or Firefox (so this example won't work).</p>
<div id="div1">
<p><b>Hello</b> world!</p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
<li>List item 3</li>
</ul>
</div>
<textarea rows="10" cols="40" id="text1"></textarea><br />
<input type="button" value="Make List" onclick="makeList()" />
</body>
2.TreeWalker
nextNode()和previousNode()
parentNode()遍历到当前节点的父节点
firstChild():遍历到当前节点的第一个子节点
lastChild():遍历到当前节点的最后一个子节点
nextSibling():遍历到当前节点的下一个同辈节点
previousSibling():遍历到当前节点的上一个同辈节点
创建TreeWalker对象
document.createTreeWalker()
四个参数:遍历起点(根节点)、要显示的节点类型、过滤器、是否扩展实体引用的布尔值。
<script type="text/javascript">
function makeList() {
var div = document.getElementById("div1");
var filter = function(node){
return (node.tagName.toLowerCase() == "li") ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP;
};
var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, filter, false);
var output = document.getElementById("text1");
var node = walker.nextNode();
while (node !== null) {
output.value += node.tagName + "\n";
node = walker.nextNode();
}
}
</script>
四.范围
1.DOM中的范围
createRange()方法
selectNode()选择整个节点,包括子节点
selectNodeContents()只选择节点的子节点
用DOM范围实现复杂选择
setStart() setEnd():参数一个参照节点和一个偏移量
deleteContents()
<p><b>he</b><b>llo</b>world</p>
var p1=document.getElementById("p1");
helloNode=p1.firstChlid.firstChild;
worldNode=p1.lastChild;
range=document.createRange();//创建范围
range.setStart(helloNode,2);
range.setEnd(worldNode,3);
range.deleteContents();
结果:
<p><b>he</b>rld!</p>
插入DOM范围中的内容:
insertNode();
清理DOM范围
range.detach();//从文档中分离
range=null;//解除引用