Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > javascript之DOM技术(二)
【标  题】:javascript之DOM技术(二)
【关键字】:javascript,DOM
【来  源】:http://www.blogjava.net/killme2008/archive/2007/02/10/99135.html

javascript之DOM技术(二)

Your Ad Here 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.通过隐藏层实现自定义鼠标提示的例子:
<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>

点击按钮时将三个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()方法创建范围

(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);

两个范围,通过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>

(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");

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);

另外,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.范围的常见应用,比如搜索引擎中,搜索出来的链接中的关键字用特别的颜色包围起来,另外就是网页广告比较常用。
opencms 介绍及在weblogic8下的部署(原创):【上一篇】
探讨一个可能的大访问量交易网站的开发注意事项:【下一篇】
【相关文章】
  • [整理]JavaScript最流行的2种定义类的方式
  • [读prototype] 深入javascript的动态性和'this'的使用
  • 256M DOM上安装运行Linux9.0 (成功版)
  • JSP中文乱码显示及javascript与JSP变量传递问题
  • 基于XML的无限分类(jdom+xpath)
  • Liferay 的 Javascript 函数类——Calendar
  • Liferay 的 Javascript 函数类——ColorPicker
  • Liferay 的 Javascript 函数类——Editor
  • Liferay 的 Javascript 函数类——Portlet
  • 给JavaScript加上一个StringBuilder类
  • 【随机文章】
  • 内存池模型设计探讨
  • 这个Flash开头那个时锋网络的那个效果怎么做出来的
  • Unix远程命令调用的实现
  • 前世谁埋的你?
  • mysql常用命令一(登录、增加用户、密码更改)
  • DNN Store和Categories模块有冲突,我改了一下dnn文件,解决了冲突问题,从这里下载修正后的安装包
  • JBuilder开发Struts应用
  • 三机联网有新招
  • 禁止在“系统属性”中出现“设备管理器”的菜单
  • 只要你把debian安装上你的电脑就再也不会决定去卸载它
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.