Получить чистый текст без HTML-элемента с помощью javascript?

У меня есть кнопка 1 и некоторый текст в моем HTML, например:

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? Спасибо.

Ответ 1

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

Ответ 2

Вы можете использовать это:

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

В зависимости от того, что вам нужно, вы можете использовать либо element.innerText, либо element.textContent. Они различаются по-разному. innerText пытается приблизиться к тому, что произойдет, если вы выберете то, что видите (визуализировали html), и скопируйте его в буфер обмена, а textContent сортирует только полосы html-тегов и дает вам то, что осталось.

innerText также совместим со старыми браузерами IE (оттуда).

Ответ 3

Если вы можете использовать jquery, то его простой

$("#txt").text()

Ответ 4

Этот ответ будет работать, чтобы получить только текст для любого элемента 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;
}

Ответ 5

В зависимости от того, что вам нужно, вы можете использовать либо element.innerText, либо element.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;

Ответ 6

Это работает для меня скомпилировано на основе того, что было сказано здесь с более современным стандартом. Это работает лучше всего для нескольких взглядов.

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

Ответ 7

Это должно работать:

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/

Ответ 8

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

Это должно сделать это.

Ответ 9

Попробуйте (короткая версия Gabi ответьте на идею)

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>