通过javascript获取没有HTML元素的纯文本?

Joh*_*hn 111 html javascript

我在我的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>
Run Code Online (Sandbox Code Playgroud)

当用户单击该按钮时,该内容<p id='txt'>将成为以下内容

预期结果:

<p id='txt'>
// All the HTML element within the <p> will be disappear
I am working in ABC company.
</p>
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我如何编写javascript函数?谢谢.

Gab*_*aru 198

你可以用这个:

var element = document.getElementById('txt');
var text = element.innerText || element.textContent;
element.innerHTML = text;
Run Code Online (Sandbox Code Playgroud)

根据您的需要,您可以使用element.innerTextelement.textContent.它们在很多方面有所不同.innerText尝试估计如果你选择你所看到的(渲染的html)并将其复制到剪贴板会发生什么,而textContent只是剥离html标签并给你剩下的东西.

innerText 也具有与旧IE浏览器的兼容性(来自那里).

  • +1 - 正在寻找一些高性能的`text`方法,因为它在循环中完成了很多.jQuery不够高效,但速度非常快.使用IE8 +,chrome,ff.完善. (3认同)
  • textText不会返回脚本/样式标记的隐藏文本和内容.如果您使用的是支持textContent的IE版本,最好先使用它,所以`el.textContent || el.innerText || ""`. (3认同)
  • 在旧的IE上,`el.textContent`将是`undefined`而`el.innerText`可能是````.但是`""|| undefined`是'undefined`.使用`el.innerText || el.textContent || ''`可能会更好. (2认同)
  • 对于今天阅读此答案的任何人,在此答案六年多之后,现在您只需使用“var text = element.textContent;”即可。除非出于某些不道德的原因,您仍然必须支持 [IE8 或以下](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent#Browser_compatibility)。 (2认同)

jco*_*ctx 68

[2017-07-25]因为这仍然是一个公认的答案,尽管是一个非常hacky的解决方案,我将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>
Run Code Online (Sandbox Code Playgroud)

  • 坏因为hacky和慢.是否保证渲染文本本身不得包含标签? (3认同)
  • 试图用正则表达式解析HTML是非常危险的 - 实际上不可能(我怀疑它可能在理论上是不可能的)才能正确.有太多的边缘情况,然后在面对奇怪的输入时你的代码会爆炸,这可能经常被用来做XSS. (3认同)
  • 我猜测为什么它被接受了:它是一个完整的答案,可以立即剪切并粘贴到html文件中并使用浏览器进行测试.我从来没有说过这是一个很好的答案.我看到所有*好*答案都在那里后发布了,并且没有被接受,并认为OP需要一点手握.对于已知HTML源不包含不平衡尖括号的任何应用程序,它仍然足够好. (2认同)

Sar*_*ath 24

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

$("#txt").text()
Run Code Online (Sandbox Code Playgroud)

  • 我只想说,看看所有纯粹的JS答案,然后看看这个.这是我使用jQuery的第二个最重要的原因(即,它简化了任务,减少了我的工作量,并提高了可读性).第一个最重要的原因(对我而言)是因为它处理了许多交叉兼容性问题,我甚至可能都不知道(比如使用jQuery来调整不透明度,所以我不必为IE8编写单独的行)目标是`filter`属性.我知道纯粹的JS在速度方面在技术上更有效率,但在大多数正常情况下这几乎不再重要. (8认同)
  • pure js one liner equivalent:`document.querySelector("#txt").innerText;`当人们只需要几行代码时,人们经常会包含整个jQuery库.这是不好的做法. (4认同)

Jam*_*mes 10

这个答案将只用于获取任何HTML元素的文本.

第一个参数"node"是从中获取文本的元素.第二个参数是可选的,如果为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;
}
Run Code Online (Sandbox Code Playgroud)