我正在使用CMS生成双断符号来代替我首选的段落标记。 我试过了:
$('<br /><br />').replaceWith('</p>');
笑完了之后;如果可能的话,请你告诉我,如果是的话,最好的方法就是解决这个问题。
更新(来自OP评论):
这些段落不是空的,它们在开头有一个<p>
标记,最后一个段落以</p>
结尾,两者之间的段落用双<br>
标记隔开。
我无法访问编辑器代码,这是我的问题。这是自定义构建和糟糕。
答案 0 :(得分:3)
有几种方法可以试试这个。最好的一个(因为你已经在使用jQuery)可能正在使用contents():
$('.your_cms_container').contents().filter(function() {
return this.nodeType == 3; // Only text nodes
}).wrap('<p></p>')
这将包装段落标记中的所有文本节点。通过撕掉所有标签来跟随它:
$('.your_cms_container').filter('br').remove();
当然,如果您的文本节点不是主文本容器的所有简单子节点,它会变得更复杂。
另一个(脏)选项只是手动修改html,然后在完成后将其重新放入jQuery:
var htmlAsString = $('.your_cms_container').html(); // Get the contents as simple text
... // Do nasty things to the string here
$('.your_cms_container').html(htmlAsString); // Put it back and let jQuery try and sort out any mess
我不是说第二种方式是错误的,有时它是在不重写所有内容的情况下完成任务的唯一方法。但是如果我必须这样做,它仍然会让我觉得很脏; - )
答案 1 :(得分:1)
<br>
个节点。 (可选)直接忽略它们
在<p>
区块内。<br>
节点,请包装紧跟在其之前或之后的任何文本节点。<br>
节点。此方法处理嵌套,不会废弃链接,页面布局等。
代码:
$('.your_cms_container br').each ( function () {
if (this.parentNode.nodeName != "P") {
$.each ([this.previousSibling, this.nextSibling], function () {
if (this.nodeType === 3) { // 3 == text
$(this).wrap ('<p></p>');
}
} );
$(this).remove (); //-- Kill the <br>
}
} );
在编辑OP的问题之后,我意识到我还没有完全解决他的具体情况。 (我使用上面的代码,在用户脚本中产生了很大的效果。)
他想改变这个:
<p> "Paragraph 1" <br />
<a href="http://xkcd.com/246/">Link, the first</a>
Line after single break.
<br /><br />
"Paragraph 2"
</p>
进入这个:
<p> "Paragraph 1" <br />
<a href="http://xkcd.com/246/">Link, the first</a>
Line after single break.
</p>
<p> "Paragraph 2" </p>
困难在于:您不想删除嵌套元素(如果有)或事件处理程序(如果有)。
为此,请使用以下方法:
p:has(br+br)
等选择器抓住有问题的段落。请注意,相邻的选择器会忽略文本节点 - 在这种情况下,我们不希望它这样做。<br><br>
创建一个新段落,并将内容节点移动到相应的<p>
。代码看起来像这样。你可以see it in action at jsFiddle:
var badGraphs = $("#content p:has(br+br)");
var targetP = null;
var justSplit = false;
badGraphs.each ( function () {
var parentP = $(this);
parentP.contents ().each ( function (J) {
if (justSplit) {
justSplit = false;
// Continue the loop. Otherwise, it would copy an unwanted <br>.
return true;
}
var thisjNode = $(this);
var nextjNode = $(this.nextSibling);
if (thisjNode.is ("br") && nextjNode.is ("br") ) {
thisjNode.remove (); //-- Kill this <br>
nextjNode.remove (); //-- and the next
//-- Create a new p for any following content
targetP = targetP || parentP;
targetP.after ('<p></p>');
targetP = targetP.next ("p");
justSplit = true;
}
else if (targetP) {
//-- Move the node to its new home.
targetP.append (this);
}
} );
} );
答案 2 :(得分:0)
如果您的服务器语言是php,那么您可以使用str_replace()
答案 3 :(得分:-4)
这是你问题的答案:
$( 'br' ).before( '<p></p>' ).remove();
但如上所述,最好做像服务器端那样的事情