我遇到以下代码被写入我的页面的情况。
<div>
Some text here which is not wrapped in tags
<p>Some more text which is fine</p>
<p>Blah blah another good line</p>
</div>
在这种情况下,它似乎总是第一行没有包装在p标签中,这可能使解决方案变得更容易,尽管并非每次都如此。有时很好。
我需要做的是确定第一条线是否被包裹,如果没有,则将其包裹起来。
不幸的是,我不确定从哪个问题开始,所以任何帮助都会受到赞赏。
答案 0 :(得分:4)
尝试使用此代码来包装未使用<p>
标记包装的任何TextNode。
function getTextNodesIn(node, includeWhitespaceNodes) {
var textNodes = [], whitespace = /^\s*$/;
function getTextNodes(node) {
if (node.nodeType == 3) {
if (includeWhitespaceNodes || !whitespace.test(node.nodeValue)) {
textNodes.push(node);
}
} else {
for (var i = 0, len = node.childNodes.length; i < len; ++i) {
getTextNodes(node.childNodes[i]);
}
}
}
getTextNodes(node);
return textNodes;
}
var textnodes = getTextNodesIn($("#demo")[0]);
for(var i=0; i < textnodes.length; i++){
if($(textnodes[i]).parent().is("#demo")){
$(textnodes[i]).wrap("<p>");
}
}
这是一个jsfiddle,显示了这一点。
PS:TextNode检测部分来自this answer
答案 1 :(得分:4)
$('div').wrapInner('<p></p>');
$('div p > p').detach().insertAfter('div p');
答案 2 :(得分:2)
试试这个: -
<div class="container">
Some text here which is not wrapped in tags
<p>Some more text which is fine</p>
<p>Blah blah another good line</p>
</div>
JS
$(function(){
var $temp = $('<div>');
$('div.container p').each(function(){
$(this).appendTo($temp);
});
if($.trim( $('div.container').html() ).length){
var $pTag = $('<p>').html($('.container').html());
$('div.container').html($pTag);
}
$('div.container').append($temp.html());
});
以下是工作示例: -
答案 3 :(得分:0)
jQuery是bad at handling text nodes,因此您需要对此进行一些直接的DOM操作。这也使用"trim" function.。它位于jsfiddle。
var d = $("div")[0];
for(var i=0; i<d.childNodes.length; i++) {
if(d.childNodes[i].nodeType === 3 &&
d.childNodes[i].textContent.replace(/^\s+|\s+$/g, "")) {
wrapNode(d.childNodes[i]);
}
}
function wrapNode(node) {
$(node).replaceWith("<h1>" + node.textContent + "</h1>");
}
答案 4 :(得分:0)
遇到类似需求并尝试使用解决方案@Arash_Milani。解决方案有效,但是当页面也需要进行ajax调用时,我遇到了冲突。
经过一番挖掘后,我使用.contents()
方法在api.jquery.com上找到了一个相当直接的解决方案:
$('.wrapper').contents().filter(function() {
return this.nodeType === 3;
}).wrap('<p class="fixed"></p>').end();
&#13;
p.good {
color: #09f;
}
p.fixed {
color: #ff0000;
text-align: center;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="wrapper">
Some plain text not wrapped in any html element.
<p class="good">This text is properly wrapped in a paragraph element.</p>
</div>
&#13;