Javascript標準DOM Range操作全集第1/3頁

來源:互聯網
上載者:User

2級DOM定義了一個createRange()方法,如果是按照DOM此標準的瀏覽器(IE並不是支援此標準的,但是IE裡的屬性或方法卻遠比標準中定義的多得多),它屬於document對象,所以建立一個range對象要這樣做:

var oRange = document.createRange();

如果你要檢測你的瀏覽器是否支援此標準Range對象,可以用hasFeature()方法來檢測:

var supportsDOMRanges = document.implementation.hasFeature("Range", "2.0");
if (supportsDOMRange) {
var oRange = document.createRange();
//range code here
}
Range對象進行簡單的選擇
最簡單用Range進行選擇,用selectNode()或者selectNodeContents()方法,這兩個方法只有一個接收參數,一個DOM節點。

selectNode()方法選擇全部節點,包括它的孩子,而selectNodeContents()選擇的節點只是它的孩子。如

<p id="p1"><b>Hello</b> World</p>
<script>
var oRange1 = document.createRange();
var oRange2 = document.createRange();
var oP1 = document.getElementById("p1");
oRange1.selectNode(oP1);
oRange2.selectNodeContents(oP1);
</script>

oRange1和oRange2包含上面所說的兩種方法,但是看了下面的示圖相信你能很快明白這兩個方法的區別:

當你建立了一個Range對象時,Range執行個體就會有以下的屬性:
startContainer — 返回range對象從何開始的節點對象(父節點的第一個節點)
startOffset — 返回Range開始的位移量(offset),如果startContainer是一個文本節點,注釋節點,或者是CDATA節點,這個屬性返迴文本的位移量,否則返回第一個節點的索引。
endCOntainer — 返回Range對象最後一個節點對象(父節點的最後一個節點)
endOffset — 返回Range結束時的位移量(offset)特性與startOffset相同。
commonAncestorContainer — 返回第一個包含該Range對象的節點。

註:這些屬性均為唯讀屬性(read-only),startOffset和endOffset將在下文中有較詳細的解釋。

下面這段代碼將說明這些屬性,請在Mozilla firefox裡運行(支援此標準的瀏覽器——DOM2級,IE裡將無效):

<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>
</body>
</html>

上面的代碼將不作注釋了,有什麼問題,在評論中留言。

Range中還有一些其它的方法:
setStartBefore(node) — 設定Range的相對於node節點的起始位置
setStartAfter(node) — 同上
setEndBefore — 設定Range的相對於node節點的結束位置
setEndAfter — 同上

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.