2017-03-07 59 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你的答案:-) –