从最外层HTML标记应用于-jquery中所有文本节点的标记返回文本

时间:2013-01-21 14:43:06

标签: javascript jquery html text

我的文字段落可能是这样的:

<p>
   <span style='font-family:arial'>
      Some text
   </span>
</p>

<p>
   <strong>
      Some more text
   <strong>
</p>

<p>
   <strong>
      <em>
         Yet more text
      </em>
   </strong>
</p>

然而,有很多嵌套标签,我只能使用$('p').text()来获取文本。问题是当<br>弹出中间时。在这种情况下,文本所处的任何标记都会被分解。例如,这个:

<p>
  <strong>
     Some more text
  </strong>
</p>

将变为:

<p>
  <strong>
     Some 
  </strong>
  <br />
  <strong>
     more text
  </strong>
</p>

所以你看,<strong>标签中有2个文本节点,而不只是一个。我想要做的是仅使用原始父标记获取文本,将<br>视为另一个文本节点,但没有<br> - 诱导标记 - 拆分入侵。例如,给定上面的2节点HTML,我只想要一个返回此函数的函数:

<p>
  <strong>
     Some 
     <br />
     more text
  </strong>
</p>

对于一些给定格式,这样会很好,但我需要保留不同类型的HTML嵌套(例如<p><strong><em><p><em><strong><p><strong><span>等等。

修改

我认为最简单的方法是获取$('p').html()并简单地删除<br>周围的所有标签,而不是迷失在循环中?在<br>的左边是关闭标签,在右边有开口标签。那会有正则表达式解决方案吗?

2 个答案:

答案 0 :(得分:2)

  1. <br>
  2. 中找到每个<p>
  3. 对于每个<br>元素,比较前一个和后一个元素的名称
  4. 如果他们的名字相同,请将<br>和以下元素的内容移到前一个元素中
  5. 删除现在为空的后续元素
  6. 此:

    $("p").clone().find("br").each(function() {
      var $this = $(this), $prev = $this.prev(), $next = $this.next();
      if ( $prev.length && $prev.prop("nodeName") === $next.prop("nodeName") ) {
        $prev.append( $this, $next.contents() );
        $next.remove();
      }
    }).end().each(function () {
        console.log( $(this).html() );
    });
    

    (请注意,我使用clone()来避免修改原文。)

    适用于

    <p>
      <strong>
         Some 
      </strong>
      <br />
      <strong>
         more text
      </strong>
    </p>
    

    将此内容写入控制台

    <strong>
       Some 
    <br>
       more text
    </strong>
    

    http://jsfiddle.net/Tomalak/y3hSp/


    这是一种迭代方法,以jQuery插件的形式折叠由<br>分隔的相邻节点:

    $.fn.extend({
        collapseBreaks: function () {
            return this.each(function () {
                var done = false;
    
                while (!done) {
                    done = true;
    
                    $(this).find("br").each(function() {
                        var $this = $(this), 
                            $prev = $this.prev(), 
                            $next = $this.next();
    
                        if ( 
                            $prev.length 
                            && $prev.prop("nodeName") === $next.prop("nodeName") 
                        ) {
                            $prev.append( $this, $next.contents() );
                            $next.remove();
                            done = false;
                        }
                    });       
                }
            });
        }
    });
    

    用作

    $("p").collapseBreaks(); 
    

    http://jsfiddle.net/Tomalak/FJFgk/3/

答案 1 :(得分:1)

那么,那么:

var innerString = thatPFromYourQuestion.innerHTML;
innerString = innerString.replace("<.*>", "");

那应该用空字符串替换每个标记,返回所有文本。

我想我误解了你的问题。如果您只是想要从字面上理解该段落中的内容,那么.innerHTML就会做到这一点。如果您希望<BR />被切断,则应使用replace()来电略有不同的版本:

innerString = innerString.replace("<br>", "");