javascript之DOM技术(一)
一。样式编程
1.页面中的每一个元素都具有一个style对象,此对象管理元素的CSS样式。这是在IE4.0引入的,后来作为DOM标准被接受。使用方法:
var oDiv=document.getElementById("div1");
alert(oDiv.style.backgroundColor);
style对象拥有一个cssText属性,返回描述元素样式的CSS字符串。
2.样式对象style的方法(IE6并不支持这些方法):
(1)getPropertyValue(propertyName)——返回CSS特性propertName的字符串值,比如this.style.getPropertyValue("background-color");这里的propertyName必须按照CSS的样式定义。
(2)getPropertyPriority()——返回important字符串或者为空
(3)item(index)——返回给定索引处的CSS特性名称
(4)removeProperty(propertyName)——移除某CSS特性
(5)setProperty(propertyName,value,priorty)——按照执行优先级设定CSS特性的值
3.通过隐藏层实现自定义鼠标提示的例子:
这里使用了我在《 javascript事件模型框架》中摘记的JS文件。实现可折叠区域的道理与此相同,很常用的功能,不再细说。
4.访问样式表,因为style对象只能访问一个元素的CSS样式,而对于<style/>定义的或者外部CSS文件定义的CSS规则没办法访问,这就引出了如何访问样式表的问题。我们可以通过下面的方式访问:
document.styleSheets返回页面上所有样式表的引用,标准DOM中规定每个样式表的规则集合叫cssRules,而IE中叫rules,所以我们用上面的表达式来处理浏览器兼容问题。一个访问的例子:
点击按钮时将三个div的背景色都设置为蓝色。
5.最终样式:顾名思义,就是样式规则(外部定义和内联的)综合计算之后呈现给用户的样式信息,用来告诉我们元素最终是如何显示在屏幕上的。IE和标准的DOM也有区别:
(1)IE中的最终样式称为currentStyle对象,与style对象不同的是它是只读的,你只能读而不能给它赋值。
(2)DOM中的最终样式,通过document.defaultView.getComputedStyle(元素对象,伪元素对象或者null)方法获得
二。innerHTML和innerText
很常用的功能,特别是在AJAX应用中,经常采用的手段是从服务端返回一小段HTML代码,通过innerHTML嵌入某个层当中来动态显示下拉框等。一个比较常见的用法:
oDiv.innertText=oDiv.innerText;
表示从指定元素中删除所有的HTML标签。
三。outerText和outerHTML
与innerHTML和innerText,不过替换的是整个目标节点,仅在IE和opera中支持此特性
四。范围
叫选区也许更为恰当,range用来选择文档的某个部分而不管节点的边界。也有两种的范围实现:DOM和IE的
1.DOM的range
(1)在DOM中创建选区的方法:
(2)简单选区
考虑下面的代码:
我们通过下面的JS代码来访问上面这段代码:
两个范围,通过selectNode和selectNodeContents方法来选区,有什么不同呢?oRange1选中的范围包括<p/>节点以及它的全部子节点,而oRange2只包含op1的子节点和文本节点( 就是"< b > hello </ b > world")。
(3)范围的特性:
<1>startContainer——范围是从哪个节点开始的,也就是第一个节点的父节点
<2>startOffset——在 startContainer的偏移位置。
<3>endContainer——最后一个节点的父节点
<4>endOffset——在 endContainer中范围结束的偏移位置
<5>commonAncestorContainer——startContainer和endContainer都处于哪个最小的节点
演示这些特性的例子:
(4)复杂选区
通过setStart和setEnd来实现复杂选区,两个方法都接受两个参数:节点引用和偏移量。
(5)与范围对象的交互
<1>deleteContents(),删除范围内容
<2>extractContents,与 deleteContents()相似,只不过返回被删除的文档碎片
<3>cloneContents(),创建范围内容副本
<4>surroundContents(node),插入包围范围的内容
<5>insertNode(node),在选区开头插入节点
<6>cloneRange(),复制范围
<7>detach(),释放系统资源
<8>compareBoundaryPoints()方法,比较范围,两个参数,一个比较规则(Range.START_START, Range.START_TO_END, Range.END_TO_START, Range.END_TO_END),一个是比较的范围引用
2.IE中的范围
IE的范围并不标准,主要用来处理文本节点,调用<body/>,<button/>,<input/>,<textarea>节点的createTextRange方法来创建范围,建议用document.body.createTextRange()来创建,因为其他元素创建的范围仅能用于它们内部。
(1)简单选区:
同样以下面这段代码为例子:
要选择hello,可以使用:
findText方法还可以接受第2个参数,如oRange.findText("hello",1);将选择hello之后再次找到的hello文本节点。
与DOM中的selectNode方法最相似的是IE的moveToElementText()方法,比如我们要选中p1节点以及它的所有子节点:
另外,oRange.parentElement()返回选区的父节点。
(2)复杂选区:
move(),moveStart(),moveEnd(),expand()方法实现复杂选区,这些方法都接受两个参数:移动的单位("character","word","sentence","textedit")和移动的单位的个数。
(3)与范围交互
<1>text属性,比如oRange.text="hello";
<2>pasteHTML(),插入HTMl代码,比如oRange.pasteHTML("<em>test</em>");
<3>duplicate(),复制范围
<4>compareEndPoints() 方法,比较范围,第一个参数也是比较规则("StartToStart","StartToEnd,EndToStart","EndToEnd")和比较的范围引用。也可以通过isEqual()和isRange()方法来比较。
3.范围的常见应用,比如搜索引擎中,搜索出来的链接中的关键字用特别的颜色包围起来,另外就是网页广告比较常用。
一。样式编程
1.页面中的每一个元素都具有一个style对象,此对象管理元素的CSS样式。这是在IE4.0引入的,后来作为DOM标准被接受。使用方法:
var oDiv=document.getElementById("div1");
alert(oDiv.style.backgroundColor);
style对象拥有一个cssText属性,返回描述元素样式的CSS字符串。
2.样式对象style的方法(IE6并不支持这些方法):
(1)getPropertyValue(propertyName)——返回CSS特性propertName的字符串值,比如this.style.getPropertyValue("background-color");这里的propertyName必须按照CSS的样式定义。
(2)getPropertyPriority()——返回important字符串或者为空
(3)item(index)——返回给定索引处的CSS特性名称
(4)removeProperty(propertyName)——移除某CSS特性
(5)setProperty(propertyName,value,priorty)——按照执行优先级设定CSS特性的值
3.通过隐藏层实现自定义鼠标提示的例子:
<
html
>
< head >
< title > Style Example </ title >
< script type ="text/javascript" src ="detect.js" ></ script >
< script type ="text/javascript" src ="eventutil.js" ></ script >
< script type ="text/javascript" >
function showTip() {
var oDiv = document.getElementById( " divTip1 " );
oDiv.style.visibility = " visible " ;
var oEvent = EventUtil.getEvent();
oDiv.style.left = oEvent.clientX + 5 ;
oDiv.style.top = oEvent.clientY + 5 ;
}
function hideTip() {
var oDiv = document.getElementById( " divTip1 " );
var oEvent = EventUtil.getEvent();
oDiv.style.visibility = " hidden " ;
}
</ script >
</ head >
< body >
< p > Move your mouse over the red square. </ p >
< div id ="div1"
style ="background-color: red; height: 50px; width: 50px"
onmouseover ="showTip()" onmouseout ="hideTip()" ></ div >
< div id ="divTip1"
style ="background-color: yellow; position: absolute; visibility: hidden; padding: 5px" >
< span style ="font-weight: bold" > Custom Tooltip </ span >< br />
More details can go here.
</ div >
</ body >
</ html >
< head >
< title > Style Example </ title >
< script type ="text/javascript" src ="detect.js" ></ script >
< script type ="text/javascript" src ="eventutil.js" ></ script >
< script type ="text/javascript" >
function showTip() {
var oDiv = document.getElementById( " divTip1 " );
oDiv.style.visibility = " visible " ;
var oEvent = EventUtil.getEvent();
oDiv.style.left = oEvent.clientX + 5 ;
oDiv.style.top = oEvent.clientY + 5 ;
}
function hideTip() {
var oDiv = document.getElementById( " divTip1 " );
var oEvent = EventUtil.getEvent();
oDiv.style.visibility = " hidden " ;
}
</ script >
</ head >
< body >
< p > Move your mouse over the red square. </ p >
< div id ="div1"
style ="background-color: red; height: 50px; width: 50px"
onmouseover ="showTip()" onmouseout ="hideTip()" ></ div >
< div id ="divTip1"
style ="background-color: yellow; position: absolute; visibility: hidden; padding: 5px" >
< span style ="font-weight: bold" > Custom Tooltip </ span >< br />
More details can go here.
</ div >
</ body >
</ html >
这里使用了我在《 javascript事件模型框架》中摘记的JS文件。实现可折叠区域的道理与此相同,很常用的功能,不再细说。
4.访问样式表,因为style对象只能访问一个元素的CSS样式,而对于<style/>定义的或者外部CSS文件定义的CSS规则没办法访问,这就引出了如何访问样式表的问题。我们可以通过下面的方式访问:
var
cssRules
=
document.styleSheets[
0
].cssRules
||
document.styleSheets[
0
].rules;
document.styleSheets返回页面上所有样式表的引用,标准DOM中规定每个样式表的规则集合叫cssRules,而IE中叫rules,所以我们用上面的表达式来处理浏览器兼容问题。一个访问的例子:
<
html
>
< head >
< title > Accessing Style Sheets Example </ title >
< style type ="text/css" >
div.special {
background-color : red ;
height : 10px ;
width : 10px ;
margin : 10px ;
}
</ style >
< script type ="text/javascript" >
function changeBackgroundColor() {
var oCSSRules = document.styleSheets[ 0 ].cssRules || document.styleSheets[ 0 ].rules;
oCSSRules[ 0 ].style.backgroundColor = " blue " ;
}
</ script >
</ head >
< body >
< div id ="div1" class ="special" ></ div >
< div id ="div2" class ="special" ></ div >
< div id ="div3" class ="special" ></ div >
< input type ="button" value ="Change Background Color" onclick ="changeBackgroundColor()" />
</ body >
</ html >
< head >
< title > Accessing Style Sheets Example </ title >
< style type ="text/css" >
div.special {
background-color : red ;
height : 10px ;
width : 10px ;
margin : 10px ;
}
</ style >
< script type ="text/javascript" >
function changeBackgroundColor() {
var oCSSRules = document.styleSheets[ 0 ].cssRules || document.styleSheets[ 0 ].rules;
oCSSRules[ 0 ].style.backgroundColor = " blue " ;
}
</ script >
</ head >
< body >
< div id ="div1" class ="special" ></ div >
< div id ="div2" class ="special" ></ div >
< div id ="div3" class ="special" ></ div >
< input type ="button" value ="Change Background Color" onclick ="changeBackgroundColor()" />
</ body >
</ html >
点击按钮时将三个div的背景色都设置为蓝色。
5.最终样式:顾名思义,就是样式规则(外部定义和内联的)综合计算之后呈现给用户的样式信息,用来告诉我们元素最终是如何显示在屏幕上的。IE和标准的DOM也有区别:
(1)IE中的最终样式称为currentStyle对象,与style对象不同的是它是只读的,你只能读而不能给它赋值。
(2)DOM中的最终样式,通过document.defaultView.getComputedStyle(元素对象,伪元素对象或者null)方法获得
二。innerHTML和innerText
很常用的功能,特别是在AJAX应用中,经常采用的手段是从服务端返回一小段HTML代码,通过innerHTML嵌入某个层当中来动态显示下拉框等。一个比较常见的用法:
oDiv.innertText=oDiv.innerText;
表示从指定元素中删除所有的HTML标签。
三。outerText和outerHTML
与innerHTML和innerText,不过替换的是整个目标节点,仅在IE和opera中支持此特性
四。范围
叫选区也许更为恰当,range用来选择文档的某个部分而不管节点的边界。也有两种的范围实现:DOM和IE的
1.DOM的range
(1)在DOM中创建选区的方法:
var supportDOMRange=document.implementation.hasFeature("Range","2.0");
if(supportDOMRange)
var oRange=document.createRange();
先判断是否支持DOM,然后使用createRange()方法创建范围
if(supportDOMRange)
var oRange=document.createRange();
(2)简单选区
考虑下面的代码:
<
p
id
="p1"
><
b
>
hello
</
b
>
world
</
p
>
我们通过下面的JS代码来访问上面这段代码:
var oRange1=document.createRange();
var oRange2=document.createRange();
var op1=document.getElementById("p1");
oRange1.selectNode(op1);
oRange2.selectNodeContents(op1);
var oRange2=document.createRange();
var op1=document.getElementById("p1");
oRange1.selectNode(op1);
oRange2.selectNodeContents(op1);
两个范围,通过selectNode和selectNodeContents方法来选区,有什么不同呢?oRange1选中的范围包括<p/>节点以及它的全部子节点,而oRange2只包含op1的子节点和文本节点( 就是"< b > hello </ b > world")。
(3)范围的特性:
<1>startContainer——范围是从哪个节点开始的,也就是第一个节点的父节点
<2>startOffset——在 startContainer的偏移位置。
<3>endContainer——最后一个节点的父节点
<4>endOffset——在 endContainer中范围结束的偏移位置
<5>commonAncestorContainer——startContainer和endContainer都处于哪个最小的节点
演示这些特性的例子:
<
html
>
< head >
< title > DOM Range Example </ title >
< script type ="text/javascript" >
function useRanges() {
var oRange1 = document.createRange();
var oRange2 = document.createRange();
var oP1 = document.getElementById( " p1 " );
oRange1.selectNode(oP1);
oRange2.selectNodeContents(oP1);
document.getElementById( " txtStartContainer1 " ).value = oRange1.startContainer.tagName;
document.getElementById( " txtStartOffset1 " ).value = oRange1.startOffset;
document.getElementById( " txtEndContainer1 " ).value = oRange1.endContainer.tagName;
document.getElementById( " txtEndOffset1 " ).value = oRange1.endOffset;
document.getElementById( " txtCommonAncestor1 " ).value = oRange1.commonAncestorContainer.tagName;
document.getElementById( " txtStartContainer2 " ).value = oRange2.startContainer.tagName;
document.getElementById( " txtStartOffset2 " ).value = oRange2.startOffset;
document.getElementById( " txtEndContainer2 " ).value = oRange2.endContainer.tagName;
document.getElementById( " txtEndOffset2 " ).value = oRange2.endOffset;
document.getElementById( " txtCommonAncestor2 " ).value = oRange2.commonAncestorContainer.tagName;
}
</ script >
</ head >
< body >< p id ="p1" >< b > Hello </ b > World </ p >
< input type ="button" value ="Use Ranges" onclick ="useRanges()" />
< table border ="0" >
< tr >
< td >
< fieldset >
< legend > oRange1 </ legend >
Start Container: < input type ="text" id ="txtStartContainer1" />< br />
Start Offset: < input type ="text" id ="txtStartOffset1" />< br />
End Container: < input type ="text" id ="txtEndContainer1" />< br />
End Offset: < input type ="text" id ="txtEndOffset1" />< br />
Common Ancestor: < input type ="text" id ="txtCommonAncestor1" />< br />
</ fieldset >
</ td >
< td >
< fieldset >
< legend > oRange2 </ legend >
Start Container: < input type ="text" id ="txtStartContainer2" />< br />
Start Offset: < input type ="text" id ="txtStartOffset2" />< br />
End Container: < input type ="text" id ="txtEndContainer2" />< br />
End Offset: < input type ="text" id ="txtEndOffset2" />< br />
Common Ancestor: < input type ="text" id ="txtCommonAncestor2" />< br />
</ fieldset >
</ td >
</ tr >
</ table >
< p >< strong > Note: </ strong > This example uses DOM ranges and will only work in browsers that support DOM ranges. This example will fail in Internet Explorer. </ p >
</ body >
</ html >
< head >
< title > DOM Range Example </ title >
< script type ="text/javascript" >
function useRanges() {
var oRange1 = document.createRange();
var oRange2 = document.createRange();
var oP1 = document.getElementById( " p1 " );
oRange1.selectNode(oP1);
oRange2.selectNodeContents(oP1);
document.getElementById( " txtStartContainer1 " ).value = oRange1.startContainer.tagName;
document.getElementById( " txtStartOffset1 " ).value = oRange1.startOffset;
document.getElementById( " txtEndContainer1 " ).value = oRange1.endContainer.tagName;
document.getElementById( " txtEndOffset1 " ).value = oRange1.endOffset;
document.getElementById( " txtCommonAncestor1 " ).value = oRange1.commonAncestorContainer.tagName;
document.getElementById( " txtStartContainer2 " ).value = oRange2.startContainer.tagName;
document.getElementById( " txtStartOffset2 " ).value = oRange2.startOffset;
document.getElementById( " txtEndContainer2 " ).value = oRange2.endContainer.tagName;
document.getElementById( " txtEndOffset2 " ).value = oRange2.endOffset;
document.getElementById( " txtCommonAncestor2 " ).value = oRange2.commonAncestorContainer.tagName;
}
</ script >
</ head >
< body >< p id ="p1" >< b > Hello </ b > World </ p >
< input type ="button" value ="Use Ranges" onclick ="useRanges()" />
< table border ="0" >
< tr >
< td >
< fieldset >
< legend > oRange1 </ legend >
Start Container: < input type ="text" id ="txtStartContainer1" />< br />
Start Offset: < input type ="text" id ="txtStartOffset1" />< br />
End Container: < input type ="text" id ="txtEndContainer1" />< br />
End Offset: < input type ="text" id ="txtEndOffset1" />< br />
Common Ancestor: < input type ="text" id ="txtCommonAncestor1" />< br />
</ fieldset >
</ td >
< td >
< fieldset >
< legend > oRange2 </ legend >
Start Container: < input type ="text" id ="txtStartContainer2" />< br />
Start Offset: < input type ="text" id ="txtStartOffset2" />< br />
End Container: < input type ="text" id ="txtEndContainer2" />< br />
End Offset: < input type ="text" id ="txtEndOffset2" />< br />
Common Ancestor: < input type ="text" id ="txtCommonAncestor2" />< br />
</ fieldset >
</ td >
</ tr >
</ table >
< p >< strong > Note: </ strong > This example uses DOM ranges and will only work in browsers that support DOM ranges. This example will fail in Internet Explorer. </ p >
</ body >
</ html >
(4)复杂选区
通过setStart和setEnd来实现复杂选区,两个方法都接受两个参数:节点引用和偏移量。
(5)与范围对象的交互
<1>deleteContents(),删除范围内容
<2>extractContents,与 deleteContents()相似,只不过返回被删除的文档碎片
<3>cloneContents(),创建范围内容副本
<4>surroundContents(node),插入包围范围的内容
<5>insertNode(node),在选区开头插入节点
<6>cloneRange(),复制范围
<7>detach(),释放系统资源
<8>compareBoundaryPoints()方法,比较范围,两个参数,一个比较规则(Range.START_START, Range.START_TO_END, Range.END_TO_START, Range.END_TO_END),一个是比较的范围引用
2.IE中的范围
IE的范围并不标准,主要用来处理文本节点,调用<body/>,<button/>,<input/>,<textarea>节点的createTextRange方法来创建范围,建议用document.body.createTextRange()来创建,因为其他元素创建的范围仅能用于它们内部。
(1)简单选区:
同样以下面这段代码为例子:
<
p
id
="p1"
><
b
>
hello
</
b
>
world
</
p
>
要选择hello,可以使用:
var oRange=document.body.createTextRange();
oRange.findText("hello");
oRange.findText("hello");
findText方法还可以接受第2个参数,如oRange.findText("hello",1);将选择hello之后再次找到的hello文本节点。
与DOM中的selectNode方法最相似的是IE的moveToElementText()方法,比如我们要选中p1节点以及它的所有子节点:
var
oRange
=
document.body.createTextRange();
var oP1 = document.getElementById( " p1');
oRange.moveToElementText(oP1);
alert(oP1.htmlText);
var oP1 = document.getElementById( " p1');
oRange.moveToElementText(oP1);
alert(oP1.htmlText);
另外,oRange.parentElement()返回选区的父节点。
(2)复杂选区:
move(),moveStart(),moveEnd(),expand()方法实现复杂选区,这些方法都接受两个参数:移动的单位("character","word","sentence","textedit")和移动的单位的个数。
(3)与范围交互
<1>text属性,比如oRange.text="hello";
<2>pasteHTML(),插入HTMl代码,比如oRange.pasteHTML("<em>test</em>");
<3>duplicate(),复制范围
<4>compareEndPoints() 方法,比较范围,第一个参数也是比较规则("StartToStart","StartToEnd,EndToStart","EndToEnd")和比较的范围引用。也可以通过isEqual()和isRange()方法来比较。
3.范围的常见应用,比如搜索引擎中,搜索出来的链接中的关键字用特别的颜色包围起来,另外就是网页广告比较常用。