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


122

我的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函数?

谢谢。


这回答了你的问题了吗?从文本JavaScript中
删除

Answers:


73

[2017-07-25]尽管这是一个非常棘手的解决方案,但由于它仍然是公认的答案,因此我将Gabi的代码纳入其中,我自己的代码将成为一个不好的例子。

<style>
.A {background: blue;}
.B {font-style: italic;}
.C {font-weight: bold;}
</style>

<script>
// 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;
}
</script>

<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>

3
不好,因为hacky和速度慢。甚至可以保证呈现的文本本身绝不包含标签吗?
米2014年

1
不,没有这样的保证。发布时我发表了免责声明。它显然达到了OP的目的。
jcomeau_ictx 2014年

3
试图用正则表达式解析HTML确实很危险---几乎不可能正确(我怀疑理论上是不可能的)。边缘情况太多,当遇到奇怪的输入时,您的代码就会炸毁,可以经常利用它们执行XSS。
大卫

2
我对它为什么被接受的猜测:这是一个完整的答案,可以立即将其直接剪切并粘贴到html文件中,并使用浏览器进行测试。我从未说过这是一个答案。我看到所有好的答案都在那里并没有被接受后才发布,并认为OP需要一些帮助。对于任何已知HTML源不包含不平衡尖括号的应用程序,它仍然足够好。
jcomeau_ictx

211

您可以使用此:

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

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

innerText 也与旧的IE浏览器兼容(从那里来)。


3
+1-正在寻找text一种高性能的方法,因为它在一个循环中做了很多事情。jQuery的性能不足,但是速度非常快。在IE8 +,Chrome和ff中工作。完善。
Travis J

2
在旧版IE上,el.textContent将是undefined并且el.innerText可能是""。但是"" || undefinedundefined。使用el.innerText || el.textContent || ''可能会更好。
Oriol

3
innerText不返回隐藏的文本和脚本/样式标签的内容,而textContent则返回。如果您使用的是支持textContent的IE版本,则最好先使用它el.textContent || el.innerText || ""
Domino

2
对于现在阅读此答案六年以上的当今人们来说,这只是一个便条,这些天您可以使用var text = element.textContent;;除非出于某些不可思议的原因,您仍然必须支持IE8或更低版本
无用的代码,

el.innerText与大致相同el.textContent.replace(/\W+/g, ' ')。她们不一样。
Polv

26

如果可以使用jQuery,那么它很简单

$("#txt").text()

8
我只需要说,先看所有纯JS答案,然后再看这个。这是我使用jQuery的第二个最重要的原因(即,它简化了任务,减少了工作量并提高了可读性)。第一个最重要的原因(对我而言)是因为它处理了许多交叉兼容性问题,否则我可能甚至都不知道(例如使用jQuery调整不透明度,这样我就不必为IE8编写单独的一行为目标的filter属性我知道,纯JS在技术上更有效率,当谈到速度,但这并不重要了大多数正常..
VoidKing

8
纯js一个等效的衬里:document.querySelector("#txt").innerText;当人们只需要几行代码时,人们就会过于频繁地包含整个jQuery库。这是不好的做法。
Levi Johansen

10

此答案将仅获取任何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;
}

2

根据需要,可以使用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;

2

这对我来说是有效的,是根据此处所说的更现代的标准进行编译的。这最适合多次查找。

let element = document.querySelectorAll('.myClass')
  element.forEach(item => {
    console.log(item.innerHTML = item.innerText || item.textContent)
  })


1
function get_content(){
 var returnInnerHTML = document.getElementById('A').innerHTML + document.getElementById('B').innerHTML + document.getElementById('A').innerHTML;
 document.getElementById('txt').innerHTML = returnInnerHTML;
}

那应该做。


0

尝试(Gabi 答案提示的简短版本)

function get_content() {
   txt.innerHTML = txt.textContent;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.