Dom中的範圍

2021-07-09 13:00:43 字數 2847 閱讀 7790

dom2級在document型別中定義了createrange()方法。在相容dom瀏覽器的瀏覽器中,這個方法屬於document物件。使用hasfeature()或者直接檢測該方法,都可以確定瀏覽器是否支援範圍

var supportrange=document.implementation.hasfeature("range","2.0");

如果瀏覽器支援範圍,那麼就可以使用createrange()來建立dom範圍

var range=document.createrange();
新建立的範圍直接與建立它的文件關聯在一起,不能用於其他文件。每個範圍由乙個range型別的例項表示,這個例項擁有很多屬性和方法

startcontainer:包含範圍起點的幾點(即選區中第乙個節點的父節點)

startoffset:範圍在startoffset中起點的偏移量。如果startcontainer是文字節點、注釋節點或cdata節點,那麼startoffset就是範圍起點之前跳過的字元數量。否則,startoffset就是範圍中第乙個子節點的索引

endcontainer:包含範圍終點的節點(即選區中最後乙個節點的父節點)

endoffset:範圍在endcontainer中終點的偏移量

1 用dom實現簡單選擇

要使用範圍來選擇文件中的一部分,最簡的方式就是使用selectnode()或selectnodecontents(),這兩個方法都接受乙個引數,即乙個dom節點,然後使用該節點中的資訊來填充範圍。其中selectnode()方法選擇整個節點,包括其子節點;而selectnodecontents()方法則只選擇節點的子節點

在呼叫selectnode時,startcontainer、endcontainer都等於傳入節點的父節點,startoffset屬性等於給定節點在其父節點的childnodes集合中的索引。

範圍

為了更精細地控制將那些節點包含在範圍中,還可以使用下列方法

setstartbefore(refnode):將範圍的起點設定在refnode之前,因此refnode就是範圍選區中的第乙個子節點,同時將startcontainer屬性設定為refnode.parentnode,將startoffset屬性設定為refnode在父節點的childnodes集合中的索引

setstartafter(refnode):將範圍的起點設定在refnode之後,因此refnode就不在範圍之內,其下乙個同輩節點才是選區中的第乙個子節點。同時將startcontainer屬性設定為refnode.parentnode,將startoffset屬性設定為refnode在父節點的childnodes集合中的索引加1

setendbefore(refnode):將範圍的終點設定在refnode之前,,因此refnode就不在範圍之內,其上乙個同輩節點才是選區中的最後乙個子節點,同時將endcontainer屬性設定為refnode.parentnode,將endoffset屬性設定為refnode在父節點的childnodes集合中的索引

setendafter(refnode):將範圍的終點設定在refnode之後,因此refnode就是範圍選區中的最後乙個子節點,同時將endcontainer屬性設定為refnode.parentnode,將endoffset屬性設定為refnode在父節點的childnodes集合中的索引加1

2 用dom範圍實現複雜選區

要建立複雜的範圍需要使用setstart()和setend()方法。這兩個方法都接受兩個引數:乙個參照節點和乙個偏移量。對setstart()來說,參照節點會變成startcontainer,而偏移量會變成startoffset;對於setend(),參照節點會變成endcontainer,而偏移量會變成endoffset。

helloworld

var p1=document.getelementbyid("p1");

var hellonode=p1.firstchild;

var worldnode=p1.lastchild.firstchild;

var range2=document.createrange();

range2.setstart(hellonode,2);

range2.setend(worldnode,3);

在建立範圍時,內部會為這個範圍建立乙個文件片段,範圍所屬的全部節點都被新增到了這個文件片段中。對於上面的例子,範圍經過計算知道選區中缺少乙個結束的標籤,因此就會在後台動態載入乙個該標籤。修改後的dom如下所示

helloworld

利用deletecontents()可以從文件中刪除範圍所包含的內容 range2.deletecontents()

利用insertnode()方法可以向範圍選區的開始處插入乙個節點。

除了向範圍內部插入內容之外,還可以環繞範圍插入內容,此時就使用surroundcontents()方法,這個方法接受乙個引數,即環繞範圍內容的節點。

範圍

var p=document.getelementbyid("p");

var ptext=p.firstchild;

var range1=document.createrange();

range1.selectnode(ptext);

var span=document.createelement("span");

span.style.backgroundcolor="yellow";

range1.surroundcontents(span);

執行結果就是「範圍」被新增了黃色背景

DOM中的範圍

dom2級在doucment型別中定義了createrange 方法。在相容dom的瀏覽器中屬於document物件。1.建立dom範圍 var range document.createrange 2.用範圍來實現簡單選擇 selectnode 選擇整個節點,包括子節點 range.selectn...

DOM中的範圍

1.範圍 通過範圍可以選擇文件中的乙個區域,不必考慮節點的界限。使用document.createrange 方法可以建立範圍 range型別的例項 新建立的範圍直接與建立他的文件關聯在一起,不能用於其他文件。使用range型別的例項 範圍 來選擇文件的一部分可以使用selectnode dom節點...

C 中變數的作用範圍 可見範圍

作用域為當前 塊,即 中。在 塊外部不可見。區域性靜態變數,即在 塊中宣告的靜態變數,作用域為當前 塊,超過該 塊則不可見 static int a 0 void test 2.類靜態成員變數,作用域為當前類,超出類範圍則不可見 static int a class test 3.全域性靜態變數,不...