jQuery.replaceWith,将<br/> <br/>转换为<p> </p>?

时间:2011-10-11 08:13:21

标签: jquery html paragraphs

我正在使用CMS生成双断符号来代替我首选的段落标记。 我试过了:

$('<br /><br />').replaceWith('</p>');

笑完了之后;如果可能的话,请你告诉我,如果是的话,最好的方法就是解决这个问题。

更新(来自OP评论):
这些段落不是空的,它们在开头有一个<p>标记,最后一个段落以</p>结尾,两者之间的段落用双<br>标记隔开。

我无法访问编辑器代码,这是我的问题。这是自定义构建和糟糕。

4 个答案:

答案 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)

  1. 获取所有<br>个节点。 (可选)直接忽略它们 在<p>区块内。
  2. 然后,对于每个<br>节点,请包装紧跟在其之前或之后的任何文本节点。
  3. 最后,删除<br>节点。
  4. 此方法处理嵌套,不会废弃链接,页面布局等。

    代码:

    $('.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>
    


    困难在于:您不想删除嵌套元素(如果有)或事件处理程序(如果有)。

    为此,请使用以下方法:

    1. 使用p:has(br+br)等选择器抓住有问题的段落。请注意,相邻的选择器会忽略文本节点 - 在这种情况下,我们不希望它这样做。
    2. 逐个遍历每个违规段落的内容。
    3. 使用状态机在每个<br><br>创建一个新段落,并内容节点移动到相应的<p>
    4. 代码看起来像这样。你可以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()

http://php.net/manual/en/function.str-replace.php

答案 3 :(得分:-4)

这是你问题的答案:

$( 'br' ).before( '<p></p>' ).remove();

但如上所述,最好做像服务器端那样的事情