【问题标题】:How to get parent element html but not children tags?如何获取父元素html而不是子标签?
【发布时间】:2021-12-24 14:40:57
【问题描述】:

我不确定我给我的问题提供了正确的标题,但我想要求做类似的事情:

我想获取父元素的 HTML 内容。通过这样做,这也将包括子元素的 HTML 标记,但我不希望这样。我只想要儿童 HTML。

例如:

<div class="test"> This is content of div
  <p class="boring_class" style="borinhdlfj"> This is paragraph<br> content.<span><i>As you<br> can</i></span> see I have added <br> tag</p>
</div>

从上面的例子如果我使用.text() jquery 方法来获取 div 内容,我将只获取文本而不是&lt;br&gt; 标签。但是如果我使用.html() jquery,这也将包括&lt;p class="boring_class" style='dflkdjf'&gt;....&lt;/p&gt;,但我不想要那个。

我只想要子元素的 html,即:This is paragraph&lt;br&gt; content.As you can see I have added &lt;br&gt; tag。

我怎样才能做到这一点?

最终输出应如下所示:

This is content of div This is paragraph <br> content.As you can see I have added <br> tag

【问题讨论】:

    标签: javascript html jquery dom


    【解决方案1】:

    作为对问题的一种可能解释:

    获取所有子节点的 html,包括文本 [不在子节点中]

    您可以使用.contents() 包含父节点的文本节点(不在标签中的部分,例如“这是 div 的内容”)然后循环遍历这些节点以获取文本或 html,具体取决于它的位置是,给予:

    var output = $(".test").contents().map((i, e) => {
        if (e.nodeType == 3)
          return $(e).text();
        return $(e).html()
      })
      .toArray()
      .join(" ");
    
    console.log(output)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="test"> This is content of div
      <p class="boring_class" style="borinhdlfj"> This is paragraph<br> content.As you can see I have added <br> tag</p>
    </div>

    请注意,这包括问题示例输出中未包含的所有空格(换行符),因此您可能需要删除这些空格才能完全匹配。

    【讨论】:

    • 这样就行了。
    • 这是有效的,但一个问题是它只适用于有孩子的父母。就我而言,父母的孩子也包括孩子。例如: lorem ipsum some text 和children里面可以包含更多的children。
    • 您需要描述在这种情况下您希望它如何处理。内部孩子应该包含html吗?中间件(父母的孩子,也是孩子的父母)应该是纯文本还是包括html?您当前的要求是:顶级 = 纯文本,子级 = html。那么你的第一个“孩子”应该给你什么?
    • 在&lt;a&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;的情况下,你目前有a=text,b=html,那么在&lt;a&gt;&lt;b&gt;&lt;c&gt;&lt;/c&gt;&lt;/b&gt;&lt;/a&gt;的情况下应该怎么做-现在,c包含在b(如您的示例中,&lt;br&gt; 标签包含在“b”中,&lt;br&gt; 标签在这种情况下为c。
    【解决方案2】:

    您可以通过使用innerHTML 在常规javascript 中完成此操作,如下所示。

    欲了解更多信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

    const list = document.getElementsByClassName("test")[0];
    
    const inner = list.innerHTML;
    
    const noP = inner.replace(/<p[^>]*>/g, "").replace(/<\/p[^>]*>/g, "").replace(/\n/g,'');
    
    console.log(noP);
    <div class="test"> This is content of div 
    <p class="boring_class" style="borinhdlfj"> This is paragraph<br> content.As you can see I have added <br> tag</p>
    </div>

    【讨论】:

    • 什么意思?他想要的输出实际上正是我正在记录到控制台的内容。 (除了他不小心包含的主要文本)。控制台正在记录`这是段落
      内容。如您所见,我添加了
      标签`,他想要的输出是This is paragraph &lt;br&gt; content.As you can see I have added &lt;br&gt; tag
    • 您缺少 This is content of div 部分 - 他想要所有文本,包括父挖掘文本,但忽略不是 &lt;br&gt; 的标签
    • 是的,我确实在回答这个问题时遇到了一些麻烦,但我现在明白你是对的。我被困在他说的地方“我只想要子元素的 html,它是:这是段落
      内容。如您所见,我添加了
      标签。”我认为您对用户正在寻找什么有了更好的了解。老实说,虽然...解析该字符串比解析用户在该问题中的意图要容易得多:)
    • @Stender - 我误解了用户的问题。感谢您的澄清。我更新了一个不是特别优雅的修复程序,并且仅适用于 &lt;p&gt; 标记,如本例所示。 @freedomn-m 有一个更优雅的解决方案。以他/她的方式发送你所有的赞成票:)
    • @Stender 是对的。我想忽略不是
      的标签。但是我忘记提到 children 里面也包含 children。并且可以有更多的嵌套。
    猜你喜欢
    • 2021-09-28
    • 2019-08-22
    • 2012-05-16
    • 2012-01-21
    • 2019-05-15
    • 2023-03-07
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多