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


122

У меня есть кнопка 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?

Спасибо.


Отвечает ли это на ваш вопрос?
Убрать

Ответы:


73

[2017-07-25] поскольку это по-прежнему общепринятый ответ, несмотря на то, что это очень хакерское решение, я включаю в него код Габи , оставляя свой собственный в качестве плохого примера.

<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
Плохо, потому что хакерский и медленный. Есть ли гарантия, что сам отображаемый текст никогда не должен содержать тегов?
Domi

1
нет, такой гарантии нет. Я дал отказ от ответственности при публикации. очевидно, это служило целям ОП.
jcomeau_ictx 09

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.innerTextили element.textContent. Они во многом различаются. innerTextпытается приблизиться к тому, что произошло бы, если бы вы выбрали то, что вы видите (визуализированный HTML), и скопировали его в буфер обмена, в то время какtextContent просто удалит теги html и даст вам то, что осталось.

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


3
+1 - Искал какой-нибудь высокопроизводительный textметод, так как он часто выполняется в цикле. jQuery был недостаточно производительным, но очень быстро. Работал в IE8 +, chrome, ff. Отлично.
Travis J

2
В старом IE el.textContentбудет undefinedи el.innerTextможет быть "". Но "" || undefinedесть undefined. Использование el.innerText || el.textContent || ''может быть лучше.
Oriol

3
innerText не возвращает скрытый текст и содержимое тегов script / style, в то время как textContent делает. Если вы используете версию IE, которая поддерживает textContent, может быть предпочтительнее сначала использовать его, поэтому el.textContent || el.innerText || "".
Domino

2
Просто примечание для всех, кто читает этот ответ в настоящее время, спустя более шести лет после этого ответа, в наши дни вы можете просто использовать var text = element.textContent;; если только по какой-то нечестивой причине вам все равно придется поддерживать IE8 или ниже .
Useless Code

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, когда им нужна всего лишь пара строк кода. Это плохая практика.
Леви Йохансен

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.innerTextили element.textContent. Они во многом различаются. innerTextпытается приблизиться к тому, что произойдет, если вы выберете то, что видите (визуализированный html), и скопируете его в буфер обмена, в то время какtextContent просто удалит теги html и даст вам то, что осталось.

innerText больше не используется только для IE и поддерживается во всех основных браузерах . Конечно, в отличие от него textContent, он совместим со старыми браузерами IE (поскольку они его придумали).

Полный пример (из ответа Габи ):

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


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

Это должно сработать.


0

Попробуйте (краткая версия идеи ответа Габи )

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


0

Вы хотите изменить I am working in ABC company.To I am working in ABC company.. Это те же самые строки, поэтому я не вижу причин для этого, но вы можете сделать это с помощью JavaScript innerHTMLили textContent.

element.innerHTML- это свойство, определяющее HTML внутри элемента. Если вы element.innerHTML = "<strong>This is bold</strong>введете текст, он выделит жирным шрифтом текст «Это жирный».

element.textContent, с другой стороны, устанавливает текст в элементе. Если вы используете element.textContent = "<strong>This is bold</strong>, текст «Это полужирный» не будет полужирным. Пользователь буквально увидит текст « Это жирный

В вашем случае вы можете использовать любой из них. Я воспользуюсь .textContent. Код для изменения <p>элемента приведен ниже.

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». к чему-то другому.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.