2015-10-04 54 views
0

我有一个dom:<p><b>ABC</b>DEF<em>GHIK</em>。现在我想分割成<p><b>ABC</b>DEF<em>G</em></p> <p><em>HIK</em></p>。你们有什么想法?如何将DOM对象拆分为2

+0

定义拆分字符串的标准。 – Tushar

+0

鉴于dom对象,我想将它分成2段,但仍然保持其格式。这就像在contenteditable div中的段落中间按Enter键。 –

+0

是的,我明白了,但是如果你只是想分割,为什么不分割'ABC'就像'AB'和'C' – Tushar

回答

0

我发现了一种使用rangy的可行方法。 Rangy有一个强大的功能:extractContents(从一个范围中提取内容)。所以在这里的解决方案:

node(p).split(p.querySelector('em').firstChild, 2); // <p>012<em>abc</em>345</p> 

function node(node){ 
    var _node = node; 
    return{ 
     split: split 

    } 
    function split(node, offset){ 
     var blockL = document.createElement(_node.nodeName), 
      blockR = document.createElement(_node.nodeName); 

     var rangeL = rangy.createRange(); 
     rangeL.setStart(_node.firstChild, 0); 
     rangeL.setEnd(node, offset); 

     var rangeR = rangy.createRange(); 
     rangeR.setStart(node, offset); 
     rangeR.setEnd(_node.lastChild, rangy.dom.getNodeLength(_node.lastChild)); 

     var contentL = rangeL.extractContents(), 
      contentR = rangeR.extractContents(); 

     while(contentL.firstChild) blockL.appendChild(contentL.firstChild); 
     while(contentR.firstChild) blockR.appendChild(contentR.firstChild); 

     _node.parentNode.insertBefore(blockL, _node); 
     _node.parentNode.insertBefore(blockR, _node); 

     _node.remove(); 

    } 
}