如何使用 JavaScript 获取没有 HTML 元素的纯文本?

IT技术 javascript html
2021-01-20 03:55:01

我的 HTML 中有 1 按钮和一些文本,如下所示:

function get_content(){
   // I don't know how to do in here!!!
}

<input type="button" onclick="get_content()" value="Get Content"/>
<p id='txt'>
<span class="A">I am</span>
<span class="B">working in </span>
<span class="C">ABC company.</span>
</p>

当用户点击按钮时, 中的内容<p id='txt'>会变成如下预期的结果:

<p id='txt'>
// All the HTML element within the <p> will be disappear
I am working in ABC company.
</p>

谁能帮助我如何编写 JavaScript 函数?

谢谢你。

6个回答

你可以使用这个:

var element = document.getElementById('txt');
var text = element.innerText || element.textContent;
element.innerHTML = text;

根据您的需要,您可以使用element.innerTextelement.textContent它们在很多方面都不同。innerText如果您选择所看到的内容(呈现的 html)并将其复制到剪贴板,则尝试近似会发生什么,而textContent只是剥离 html 标签并为您提供剩下的内容。

innerText 还兼容旧的 IE 浏览器(来自那里)。

innerText 不会返回隐藏文本和脚本/样式标签的内容,而 textContent 会。如果您使用的是支持 textContent 的 IE 版本,则最好先使用它,因此el.textContent || el.innerText || "".
2021-03-12 03:55:01
+1 - 正在寻找一些高性能text方法,因为它在循环中完成了很多。jQuery 的性能不够好,但速度非常快。曾在 IE8+、chrome、ff 中工作。完美的。
2021-03-22 03:55:01
el.innerText大致相同el.textContent.replace(/\W+/g, ' ')他们不一样。
2021-03-22 03:55:01
对于今天阅读这个答案的任何人来说,这是一个说明,在这个答案六年多之后,这些天你可以使用var text = element.textContent;; 除非出于某些不敬虔的原因,您仍然必须支持IE8 或更低版本
2021-03-24 03:55:01
在旧的 IE 上,el.textContent将会undefined并且el.innerText可能是"". 但是"" || undefinedundefined使用el.innerText || el.textContent || ''可能会更好。
2021-04-10 03:55:01

[2017-07-25] 由于这仍然是公认的答案,尽管这是一个非常hacky 的解决方案,但我将Gabi的代码合并到其中,让我自己的代码作为一个坏例子。

// my hacky approach:
function get_content() {
  var html = document.getElementById("txt").innerHTML;
  document.getElementById("txt").innerHTML = html.replace(/<[^>]*>/g, "");
}
// Gabi's elegant approach, but eliminating one unnecessary line of code:
function gabi_content() {
  var element = document.getElementById('txt');
  element.innerHTML = element.innerText || element.textContent;
}
// and exploiting the fact that IDs pollute the window namespace:
function txt_content() {
  txt.innerHTML = txt.innerText || txt.textContent;
}
.A {
  background: blue;
}

.B {
  font-style: italic;
}

.C {
  font-weight: bold;
}
<input type="button" onclick="get_content()" value="Get Content (bad)" />
<input type="button" onclick="gabi_content()" value="Get Content (good)" />
<input type="button" onclick="txt_content()" value="Get Content (shortest)" />
<p id='txt'>
  <span class="A">I am</span>
  <span class="B">working in </span>
  <span class="C">ABC company.</span>
</p>

糟糕,因为 hacky 和缓慢。甚至可以保证呈现的文本本身绝不能包含标签吗?
2021-03-26 03:55:01
我对它为什么被接受的猜测:这是一个完整的答案,可以立即按原样剪切并粘贴到 html 文件中,并使用浏览器进行测试。我从来没有说过这是一个很好的答案。我在看到所有好的答案都在那里后发布,但没有被接受,并认为 OP 需要一点帮助。对于已知 HTML 源代码不包含不平衡尖括号的任何应用程序来说,它仍然足够好。
2021-03-27 03:55:01
不,没有这样的保证。我发帖时给出了免责声明。它显然达到了 OP 的目的。
2021-04-09 03:55:01
尝试使用正则表达式解析 HTML 真的很危险 --- 实际上不可能(我怀疑理论上不可能)正确。有太多的边缘情况,然后你的代码在面对奇怪的输入时会爆炸,这经常被利用来执行 XSS。
2021-04-09 03:55:01

如果你可以使用 jquery 那么它很简单

$("#txt").text()
我只想说,看看所有纯JS的答案,然后再看看这个。这是我使用 jQuery 的第二个最重要的原因(即,它简化了任务,减少了我的工作量,并提高了可读性)。第一个最重要的原因(对我来说)是因为它处理了许多交叉兼容性问题,否则我可能甚至都没有意识到(比如使用 jQuery 调整不透明度,这样我就不必为 IE8 单独写一行目标filter属性。我知道纯 JS 在速度方面在技术上更有效,但在大多数正常情况下这已经不再重要了。
2021-03-16 03:55:01
纯 js 一个线性等效:document.querySelector("#txt").innerText;当他们只需要几行代码时,人们经常包含整个 jQuery 库。这是不好的做法。
2021-03-18 03:55:01

此答案将仅用于获取任何 HTML 元素的文本。

第一个参数“节点”是从中获取文本的元素。第二个参数是可选的,如果 true 将在元素内的文本之间添加一个空格,否则那里不存在空格。

function getTextFromNode(node, addSpaces) {
    var i, result, text, child;
    result = '';
    for (i = 0; i < node.childNodes.length; i++) {
        child = node.childNodes[i];
        text = null;
        if (child.nodeType === 1) {
            text = getTextFromNode(child, addSpaces);
        } else if (child.nodeType === 3) {
            text = child.nodeValue;
        }
        if (text) {
            if (addSpaces && /\S$/.test(result) && /^\S/.test(text)) text = ' ' + text;
            result += text;
        }
    }
    return result;
}

根据您的需要,您可以使用element.innerTextelement.textContent它们在很多方面都不同。innerText如果您选择所看到的内容(呈现的 html)并将其复制到剪贴板,则尝试近似会发生什么,而textContent只是剥离 html 标签并为您提供剩下的内容。

innerText 不再仅用于 IE所有主要浏览器支持当然,与 不同的是textContent,它与旧的 IE 浏览器兼容(因为他们想出了它)。

完整示例(来自Gabi 的回答):

var element = document.getElementById('txt');
var text = element.innerText || element.textContent; // or element.textContent || element.innerText
element.innerHTML = text;