Javascript標(biāo)準(zhǔn)DOM Range操作全集第3/3頁(yè)
更新時(shí)間:2007年01月09日 00:00:00 作者:
從Range中插入一些數(shù)據(jù)
前一節(jié)的幾個(gè)方法解決了如何移除range中所選中的fragment?,F(xiàn)在說(shuō)明如何添加內(nèi)容到Range中。
insertNode()方法可以插入一個(gè)節(jié)點(diǎn)到Range中。假如我想把以下的節(jié)點(diǎn)插如Range中,將如何操作呢?
<span style="color: red">Inserted text</span>
看下面的代碼:
<p id="p1"><b>Hello</b> World</p>
<script>
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
var oSpan = document.createElement("span");
oSpan.style.color = "red";
oSpan.appendChild(document.createTextNode("Inserted text"));
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.insertNode(oSpan);
</script>
<script>
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
var oSpan = document.createElement("span");
oSpan.style.color = "red";
oSpan.appendChild(document.createTextNode("Inserted text"));
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.insertNode(oSpan);
</script>
那么原來(lái)的HTML將會(huì)變成這樣:
<p id="p1"><b>He<span style="color: red">Inserted text</span>llo</b> World</p>
surroundContents()的參數(shù)為一個(gè)node,它將這個(gè)node加入到Range,下面看這個(gè)示例。
<p id="p1"><b>Hello</b> World</p>
<script>
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
var oSpan = document.createElement("span");
oSpan.style.backgroundColor = "yellow";
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.surroundContents(oSpan);
</script>
<script>
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
var oSpan = document.createElement("span");
oSpan.style.backgroundColor = "yellow";
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.surroundContents(oSpan);
</script>
在oRange選取的范圍內(nèi)有一個(gè)我們新生成的節(jié)點(diǎn)span,因此選取的Range的背景變成了黃色。
collapse()方法:
collapse()方法只有一個(gè)布爾型的參數(shù),該參數(shù)為可選的,也就是說(shuō),可以有,也可以沒(méi)有,默認(rèn)為false。
true時(shí)折疊到Range邊界的首部,為false時(shí)折疊到Range尾部。即
<p id="p1"><b>Hello</b> World</p>
<script>
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.collapse(true);
</script>
<script>
var oP1 = document.getElementById("p1");
var oHello = oP1.firstChild.firstChild;
var oWorld = oP1.lastChild;
var oRange = document.createRange();
oRange.setStart(oHello, 2);
oRange.setEnd(oWorld, 3);
oRange.collapse(true);
</script>
如果你想知道該Range是否已經(jīng)折疊,可以用collapsed屬性來(lái)得到true或者false。看下面的例子。
<p id="p1">Paragraph 1</p><p id="p2">Paragraph 2</p>
<script>
var oP1 = document.getElementById("p1");
var oP2 = document.getElementById("p2");
var oRange = document.createRange();
oRange.setStartAfter(oP1);
oRange.setStartBefore(oP2);
alert(oRange.collapsed); //outputs "true"
</script>
上面的代碼輸為true。雖然我們沒(méi)有用collapse方法,但是由于我們的Range設(shè)置開(kāi)始為1末端到p2的首端,沒(méi)有任何元素。即</p>(Range開(kāi)始)(Range結(jié)束)<p id="p2">,所以顯示的是true。<script>
var oP1 = document.getElementById("p1");
var oP2 = document.getElementById("p2");
var oRange = document.createRange();
oRange.setStartAfter(oP1);
oRange.setStartBefore(oP2);
alert(oRange.collapsed); //outputs "true"
</script>
Range邊界的比較
compareBoundaryPoints()方法,語(yǔ)法形式如下:
compare = comparerange.compareBoundaryPoints(how,sourceRange)
參數(shù)含義:
compare —— 返回1, 0, -1.(0為相等,1為時(shí),comparerange在sourceRange之后,-1為comparerange在sourceRange之前)
how —— 為Range常數(shù):END_TO_END|END_TO_START|START_TO_END|START_TO_START
sourceRange —— 一個(gè)Range對(duì)象的邊界。
看下面的例子:
<p id="p1"><b>Hello</b> World</p>
<script>
var oRange1 = document.createRange();
var oRange2 = document.createRange();
var oP1 = document.getElementById("p1");
oRange1.selectNodeContents(oP1);
oRange2.selectNodeContents(oP1);
oRange2.setEndBefore(oP1.lastChild);
alert(oRange1.compareBoundaryPoints(Range.START_TO_START, oRange2));
//outputs 0
alert(oRange1.compareBoundaryPoints(Range.END_TO_END, oRange2));
//outputs 1;
</script>
下圖為這兩個(gè)Range的示意圖,結(jié)合代碼和上面的說(shuō)明,可以清晰的分析出結(jié)果了。<script>
var oRange1 = document.createRange();
var oRange2 = document.createRange();
var oP1 = document.getElementById("p1");
oRange1.selectNodeContents(oP1);
oRange2.selectNodeContents(oP1);
oRange2.setEndBefore(oP1.lastChild);
alert(oRange1.compareBoundaryPoints(Range.START_TO_START, oRange2));
//outputs 0
alert(oRange1.compareBoundaryPoints(Range.END_TO_END, oRange2));
//outputs 1;
</script>
克隆(clone)Range
這個(gè)操作很簡(jiǎn)單,只需要一句語(yǔ)句即可:
var oNewRange = oRange.cloneRange();
cloneRange()方法將返回一個(gè)當(dāng)前Range的副本,當(dāng)然,它也是Range對(duì)象。
清除Range所占的系統(tǒng)資源
當(dāng)你創(chuàng)建了Range對(duì)象最好用detach()方法來(lái)清除它所占的系統(tǒng)資源。雖然不清除,GC(垃圾收集器)也會(huì)將其收集,但用detach()釋放是一個(gè)好習(xí)慣。語(yǔ)法為:
oRange.detach();
下面一個(gè)示例在Mozilla中,利用Range可以模擬出IE中的element.insertAdjacentHTML()方法,
if (browser.isMozilla) {
HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
var df; var r = this.ownerDocument.createRange();
switch (String(sWhere).toLowerCase()) {
case "beforebegin":
r.setStartBefore(this);
df = r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df, this);
break;
case "afterbegin":
r.selectNodeContents(this);
r.collapse(true);
df = r.createContextualFragment(sHTML);
this.insertBefore(df, this.firstChild);
break;
case "beforeend":
r.selectNodeContents(this);
r.collapse(false);
df = r.createContextualFragment(sHTML);
this.appendChild(df);
break;
case "afterend":
r.setStartAfter(this);
df = r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df, this.nextSibling);
break;
}
};
}
參考文檔:HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
var df; var r = this.ownerDocument.createRange();
switch (String(sWhere).toLowerCase()) {
case "beforebegin":
r.setStartBefore(this);
df = r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df, this);
break;
case "afterbegin":
r.selectNodeContents(this);
r.collapse(true);
df = r.createContextualFragment(sHTML);
this.insertBefore(df, this.firstChild);
break;
case "beforeend":
r.selectNodeContents(this);
r.collapse(false);
df = r.createContextualFragment(sHTML);
this.appendChild(df);
break;
case "afterend":
r.setStartAfter(this);
df = r.createContextualFragment(sHTML);
this.parentNode.insertBefore(df, this.nextSibling);
break;
}
};
}
Professional JavaScript for Web Developers(Wrox)
Mozilla Develop Center Document
您可能感興趣的文章:
- JavaScript實(shí)戰(zhàn)(原生range和自定義特效)簡(jiǎn)單實(shí)例
- JavaScript中textRange對(duì)象使用方法小結(jié)
- JS Range HTML文檔/文字內(nèi)容選中、庫(kù)及應(yīng)用介紹
- js createRange與createTextRange的一些用法實(shí)例
- javascript Range對(duì)象跨瀏覽器常用操作
- Prototype使用指南之range.js
- JS效率個(gè)人經(jīng)驗(yàn)談(8-15更新),加入range技巧
- JavaScript使用Range調(diào)色及透明度實(shí)例
相關(guān)文章
javascript 數(shù)組的正態(tài)分布排序的問(wèn)題
這篇文章主要介紹了javascript 數(shù)組的正態(tài)分布排序的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2016-07-07淺談JavaScript編程語(yǔ)言的編碼規(guī)范
本文淺談 JavaScript 編程中關(guān)于編碼規(guī)范的問(wèn)題,分析其中緣由。希望引起更多 Web 開(kāi)發(fā)人員對(duì) JavaScript 編碼規(guī)范問(wèn)題的關(guān)注和對(duì)軟件產(chǎn)品質(zhì)量問(wèn)題的重視2011-10-10JavaScript數(shù)據(jù)類(lèi)型判定的總結(jié)筆記
這篇文章主要給大家分享的是JavaScript數(shù)據(jù)類(lèi)型判定,感興趣的朋友可以參考下2015-07-07前端?el-table?本地搜索的實(shí)現(xiàn)代碼
這篇文章主要介紹了前端?el-table?本地搜索的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08三張圖帶你搞懂JavaScript的原型對(duì)象與原型鏈
這篇文章介紹了JavaScript的原型對(duì)象與原型鏈,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07