2017-03-07 58 views
1

我有如下意见之间的HTML特殊内容移动HTML代码注释之间(含评论)

<p>Regular text</p> 
<p>Regular text</p> 
<!--Special Content--> 
<p>Special Content 1</p> 
<p>Special Content 2</p> 
<!--/Special Content--> 
<p>Regular text</p> 
<p>Regular text</p> 
<p id="reference">Place special content with comments below this <p> element</p> 

我要评论<!--Special Content--><!--/Special Content-->包括评论本身之间的HTML内容包装成一个<div>和将它移动到<p id="reference">元素下方。

我无法访问实际的HTML模板,所以需要通过JavaScript或JQuery来完成。

我一直无法找到一种方法来包装目前的评论内容。

最终结果应该是:

<p>Regular text</p> 
<p>Regular text</p> 
<p>Regular text</p> 
<p>Regular text</p> 
<p id="reference">Place special content with comments below this <p> element</p> 
<div id="wrapper"> 
    <!--Special Content--> 
    <p>Special Content 1</p> 
    <p>Special Content 2</p> 
    <!--/Special Content--> 
</div> 

我很欣赏你的想法。

+0

你尝试过这么远吗?我不太确定jQuery是“定位”评论节点的最佳选择 - 这可能在vanilla JS中更简单。 – CBroe

+0

@Rory McCrossan:它的信息和跟踪。其他内容会动态添加到“特殊内容”区域,如果没有其评论的话,移动它会给其他人使用“特殊内容”引用其他动作/事件造成问题 –

+0

@CBroe:纯JS也很好。我很欣赏你的方向。 –

回答

2

var dataElem = document.getElementById("data"); 
 

 
var doMove = false; 
 
var toMove = []; 
 

 
for (var i = 0; i < dataElem.childNodes.length; i++) { 
 
    var node = dataElem.childNodes[i]; 
 
    if (node.nodeType === Node.COMMENT_NODE && node.data === "Special Content") { 
 
    doMove = true; 
 
    } 
 
    if (doMove) { 
 
    toMove.push(node); 
 
    } 
 
    if (node.nodeType === Node.COMMENT_NODE && node.data === "/Special Content") { 
 
    doMove = false; 
 
    } 
 
} 
 

 
var targetElem = document.createElement("DIV"); 
 
targetElem.setAttribute("id", "wrapper"); 
 
dataElem.insertBefore(targetElem, document.getElementById("reference").nextSibling); 
 
for (var i = 0; i < toMove.length; i++) { 
 
    targetElem.appendChild(toMove[i]); 
 
}
<div id="data"> 
 
    <p>Regular text</p> 
 
    <p>Regular text</p> 
 
    <!--Special Content--> 
 
    <p>Special Content 1</p> 
 
    <p>Special Content 2</p> 
 
    <!--/Special Content--> 
 
    <p>Regular text</p> 
 
    <p>Regular text</p> 
 
    <p id="reference">Place special content with comments below this <p> element</p> 
 
</div>

+0

谢谢!这工作完美。我非常感谢你的帮助和指导。 –

0

这将参考ID标签后,将所有的特殊注释标记之间的内容。

let move = false; 
 
let parse = $('body').contents().each(function(k,v){ 
 

 
\t if(v.nodeType === 8){ 
 
\t \t if(v.nodeValue === "Special Content") move = true; 
 
\t \t else if(v.nodeValue === "/Special Content") move = false; 
 
\t } 
 
\t else if(move && v.nodeType === 1) 
 
\t \t $(v).insertAfter('#reference'); 
 
\t 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p>Regular text</p> 
 
<p>Regular text</p> 
 
<!--Special Content--> 
 
<p>Special Content 1</p> 
 
<p>Special Content 2</p> 
 
<!--/Special Content--> 
 
<p>Regular text</p> 
 
<p>Regular text</p> 
 
<p id="reference">Place special content with comments below thiselement</p>

+1

移动节点的顺序是错误的,注释节点不按照明确要求移动,它们不放在包装div中;;) – Lucero

+0

哦,我的口味哈哈我不相信我错过了。看起来你已经处理了。我upvoted你的答案:-) –