The text node that invokes the splitText method has a nodeValue equal to the substring of the value, from zero to iIndex. The new text node has a nodeValue of the substring of the original value, from the specified index to the value length. Text node integrity is not preserved when the document is saved or persisted.
if (so===0) { // At the start of text sc.parentNode.insertBefore(node, sc); } else if (so >= sc.nodeValue.length) { // At the end of text if (ns) { sc.parentNode.insertBefore(node, sc.nextSibling); } else { sc.parentNode.appendChild(node); } } else { // Middle, need to split // http://msdn.microsoft.com/zh-cn/library/ms536764.aspx nn = sc.splitText(so); sc.parentNode.insertBefore(node, nn); }
第二種情形:startContainer 節(jié)點為非 第一種情形中的節(jié)點!捌剖 Range 中的第一個節(jié)點在其父節(jié)點中的索引”。獲取 startContainer 中子節(jié)點偏移量為 startOffset 的節(jié)點 cn = sc.childNodes[so];,如果存在,則按照 insertNode 方法的定義,應(yīng)將 node 插入到該節(jié)點之前 sc.insertBefore(node, cn);,如果不存在,即 startOffset 大于等于 sc.childNodes.length,則應(yīng)將 node 插入到 startContainer 的子節(jié)點最后sc.appendChild(node);。
if (sc.childNodes.length > 0) { cn = sc.childNodes[so]; }
if (cn) { sc.insertBefore(node, cn); } else { sc.appendChild(node); }
詳細(xì)代碼實現(xiàn)如下:
zRange.prototype.insertNode = function(node) { var sc = this.startContainer, so = this.startOffset, p = sc.parentNode, ns = sc.nextSibling, nn, cn;
// 如果節(jié)點是 TEXT_NODE 或者 CDATA_SECTION_NODE if ((sc.nodeType === 3 || sc.nodeType === 4 || sc.nodeType === 8 ) && sc.nodeValue) { if (so === 0) { // At the start of text p.insertBefore(node, sc); } else if (so >= sc.nodeValue.length) { // At the end of text if (ns) { p.insertBefore(node, ns); } else { p.appendChild(node); } } else { // Middle, need to split // http://msdn.microsoft.com/zh-cn/library/ms536764.aspx nn = sc.splitText(so); p.insertBefore(node, nn); } } else { if (sc.childNodes.length > 0) { cn = sc.childNodes[so]; }
if (cn) { sc.insertBefore(node, cn); } else { sc.appendChild(node); } } }
剩下的方法,大家可以嘗試著去模擬一把,其實并不復(fù)雜,也許會其樂無窮,呵呵。
本文鏈接:http://m.95time.cn/tech/program/2010/8131.asp
出處:
責(zé)任編輯:bluehearts
上一頁 模擬實現(xiàn)Range的insertNode()方法 [2] 下一頁
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|