从没有内部文本内容的元素中获取 html 标记

Posted

技术标签:

【中文标题】从没有内部文本内容的元素中获取 html 标记【英文标题】:Get the html tag from an element without the inner text content 【发布时间】:2017-02-07 19:42:59 【问题描述】:

使用 Javascript 我希望获取一个 DOM 元素并仅获取它的 tagclassid > 等(括号中的内容),但忽略其中的实际 文本内容。有点像innerhtml/textContent 的反义词。

所以我希望得到这样的 div:

<p id="foo">Ipsum Lorem</p>

变成一个字符串:

<p id="foo"> </p>

【问题讨论】:

取节点名并将属性连接为字符串 “拿走”它们是什么意思?你真的需要 HTML 标签格式的结果吗? 我的意思是在括号内获取 html 字符串 如果您只需要括号内的内容,那么它并不是真正的标签。使用丹尼尔的答案,您可以单独获取属性键和值。所以最好的解决方案取决于你最终要对数据做什么。你知道,你永远不会得到原始的 HTML。它需要从 DOM 节点重新创建,因此可能不完全相同。 【参考方案1】:

使用.cloneNode 或者如果您不想使用它:

获取节点名并将元素属性缩减为字符串。

'use strict';

const elem = document.getElementById('foobar');
const nodeName = elem.nodeName.toLowerCase();
const attrs = [...el.attributes].map((a) => 
  if (a.value === '')
    return a.name;
  else if (a.value.indexOf('"') > -1)
    return `$a.name='$a.value'`;
  else
    return `$a.name="$a.value"`;
).join(' ');
const str = `<$nodeName $attrs></$nodeName>`;

https://jsfiddle.net/k22tyqbr/3/

【讨论】:

你刚刚重新实现了elem.cloneNode().outerHTML。注意包含双引号字符的属性值。 不知道.cloneNode...但是属性可以包含双引号?从来不知道。 是的,如果它使用单引号作为值分隔符&lt;div data-say='bob says "hello"'&gt;&lt;/div&gt; 你的代码仍然可以工作,但结果中的属性值会格式错误。 这比仅仅使用 cloneNode() 更好吗? @JonSG 可能没有,不知道那个方法【参考方案2】:

outerHTML 中的innerHTML 替换为任何内容,或者像我在这里所做的那样,用省略号“...”:

var txt = elem.outerHTML.replace(elem.innerHTML, '...');

选择元素后(getElementById("foo")),

&lt;p id="foo"&gt;Ipsum Lorem&lt;/p&gt;

这会将string 返回到var txt

&lt;p id="foo"&gt;...&lt;/p&gt;

【讨论】:

@Jamesonthedog:这没有什么问题,但作为一般解决方案的答案是痛苦的。 过多不必要的 DOM 元素序列化是不必要的搜索。当然,那里只有两个节点,但在一般情况下,这将是相当大的矫枉过正。您可以通过执行elem.cloneNode() 来克隆没有内容的节点。那么您只需要.outerHTML。我不知道你是否真的想要新内容。 ...另外,我很确定这在某些情况下会产生意想不到的结果。

以上是关于从没有内部文本内容的元素中获取 html 标记的主要内容,如果未能解决你的问题,请参考以下文章

JQuery:如何从没有根元素的 HTML 数据中按类名获取 div

使用 JavaScript 和 EJS 获取 HTML 标记的内部文本并作为值传递给输入字段

在不知道所有属性的情况下从 HTML 标记内部获取文本

jQuery获取元素值以及设置元素值总结

怎么使用jquery获得标签的值或元素的内容

通过使用该元素内部的内容来获取元素[重复]