【问题标题】:How to get the pure text without HTML element using JavaScript?如何使用 JavaScript 获取没有 HTML 元素的纯文本?
【发布时间】:2011-10-08 07:19:19
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

标签: javascript html


【解决方案1】:

[2017-07-25] 因为这仍然是公认的答案,尽管这是一个非常老套的解决方案,我将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 和慢。甚至可以保证渲染的文本本身绝对不能包含标签?
  • 不,没有这样的保证。我在发帖时给出了免责声明。它显然符合 OP 的目的。
  • 尝试用正则表达式解析 HTML 真的很危险 --- 几乎不可能(我怀疑它可能理论上不可能)正确。有太多的边缘情况,然后你的代码在遇到奇怪的输入时会崩溃,这经常被利用来执行 XSS。
  • 我猜为什么它被接受:这是一个完整的答案,可以立即将其剪切并粘贴到 html 文件中并使用浏览器进行测试。我从来没有说过这是一个的答案。我在看到所有 good 答案后发布,但没有被接受,并且认为 OP 需要一点帮助。对于任何已知 HTML 源代码不包含不平衡尖括号的应用程序,它仍然足够好。
【解决方案2】:

您想将I am working in ABC company. 更改为I am working in ABC company.。这些是相同的字符串,所以我没有理由这样做,但您可以使用 JavaScript innerHTMLtextContent 来完成此操作。

element.innerHTML 是一个定义元素内部 HTML 的属性。如果您输入element.innerHTML = "&lt;strong&gt;This is bold&lt;/strong&gt;,它将使文本“This is bold”变为粗体。

element.textContent,另一方面,设置元素中的文本。如果你使用element.textContent = "&lt;strong&gt;This is bold&lt;/strong&gt;,文本“This is bold”将不会是粗体。用户将看到文字“This is bold

在您的情况下,您可以使用任何一种。我将使用.textContent。更改&lt;p&gt; 元素的代码如下。

function get_content(){
   document.getElementById("txt").textContent = "I am working in ABC company.";
}

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

很遗憾,这不会更改它,因为它会将其更改为完全相同的文本。您可以通过更改字符串“我在 ABC 公司工作”来实现这一点。到别的东西。

【讨论】:

  • 我想你误会了。在约翰的问题中,文字是:“我在 ABC 公司工作。”只是一个例子,他不想将

    的内容设置为“文字字符串”。他没有明确地“明确”说明他想要什么,但如果你仔细阅读这个问题,就会清楚他想要什么。首先,他想要一个能够获取

    内容的函数:function get_content()。其次,他在Note/Comment 中指出,“

    中的所有 HTML 元素都将消失”。所以他想要的是得到

    的内容,比如InnerHTML,-->(续)

  • 除非他希望删除

    内容中的所有 HTML 标记。因此,在示例案例中,他想删除所有 ,只返回文本:“我在 ABC 公司工作。”,但以一种概括的方式,所以它返回实际在

    中的任何文本。比如:var p=document.getElementById("txt"); p.innerHTML=p.textContent;.

【解决方案3】:

试试(加比的短版answeridea)

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

function get_content() {
   txt.innerHTML = txt.textContent ;
}
span { background: #fbb}
<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>

【讨论】:

    【解决方案4】:

    这对我有用,是根据这里所说的以更现代的标准编译的。这最适合多次查找。

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

    【讨论】:

      【解决方案5】:

      你可以用这个:

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

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

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

      【讨论】:

      • +1 - 正在寻找一些高性能的text 方法,因为它在循环中完成了很多。 jQuery 的性能不够好,但这非常快。曾在 IE8+、chrome、ff 中工作。完美。
      • 在旧 IE 上,el.textContent 将是 undefinedel.innerText 可能是 ""。但是"" || undefinedundefined。使用el.innerText || el.textContent || '' 可能会更好。
      • innerText 不会返回隐藏文本和脚本/样式标签的内容,而 textContent 会返回。如果您使用的是支持 textContent 的 IE 版本,最好先使用它,所以el.textContent || el.innerText || ""
      • 只是给今天阅读此答案的任何人的说明,距此答案已有六年多,这些天您可以使用var text = element.textContent;;除非出于某些不敬虔的原因,您仍然必须支持 IE8 or below
      • el.innerTextel.textContent.replace(/\W+/g, ' ') 大致相同。它们不一样。
      【解决方案6】:

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

      innerTextis not just used for IE anymore,是supported in all major browsers。当然,与textContent不同的是,它与旧的IE浏览器兼容(因为他们想出了它)。

      完整示例(来自Gabi's answer):

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          $("#txt").text()
          

          【讨论】:

          • 我只想说,看看所有纯JS的答案,然后看看这个。这是我使用 jQuery 的第二个最重要的原因(即,它简化了任务、减少了我的工作量并提高了可读性)。第一个最重要的原因(对我来说)是因为它处理了许多交叉兼容性问题,否则我可能甚至不知道(比如使用 jQuery 来调整不透明度,这样我就不必为 IE8 单独写一行以filter 属性为目标。我知道纯 JS 在速度方面在技术上更高效,但在大多数情况下这几乎不再重要..
          • 纯 js 一行代码:document.querySelector("#txt").innerText; 人们经常包含整个 jQuery 库,而他们只需要几行代码。这是不好的做法。
          【解决方案9】:
          function get_content(){
           var returnInnerHTML = document.getElementById('A').innerHTML + document.getElementById('B').innerHTML + document.getElementById('A').innerHTML;
           document.getElementById('txt').innerHTML = returnInnerHTML;
          }
          

          应该可以的。

          【讨论】:

            【解决方案10】:

            应该可以的:

            function get_content(){
               var p = document.getElementById("txt");
               var spans = p.getElementsByTagName("span");
               var text = '';
               for (var i = 0; i < spans.length; i++){
                   text += spans[i].innerHTML;
               }
            
               p.innerHTML = text;
            }
            

            试试这个小提琴:http://jsfiddle.net/7gnyc/2/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-02-17
              • 2020-12-27
              • 2021-05-16
              • 2011-02-27
              • 2012-04-14
              • 1970-01-01
              • 1970-01-01
              • 2012-06-07
              相关资源
              最近更新 更多