Як отримати чистий текст без елемента HTML за допомогою JavaScript?


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?

Дякую.


Чи відповідає це на ваше запитання?
Стріпте

Відповіді:


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
Погано, бо хакі і повільно. Чи існує навіть гарантія, що сам виведений текст не повинен містити теги?
Домі

1
ні, такої гарантії немає. Я дав відмову, коли я розмістив повідомлення. це, мабуть, слугувало меті ОП.
jcomeau_ictx

3
Спроба розбору HTML за допомогою регулярних виразів дійсно небезпечна --- це практично неможливо (я підозрюю, що це може бути теоретично неможливо) вийти правильно. Занадто багато крайових випадків, і тоді ваш код вибухає, стикаючись із дивним входом, який часто можна використовувати для створення XSS.
Девід

2
я здогадуюсь, чому це було прийнято: це повна відповідь, яку можна негайно вирізати та вставити як у файл html та перевірити за допомогою браузера. Я ніколи не казав, що це була хороша відповідь. Я опублікував, побачивши, що всі хороші відповіді були там, і не були прийняті, і я подумав, що ОП потребує невеликої підтримки. вона все ще є достатньою для будь-якої програми, для якої джерело 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 +, хром, ff. Ідеально.
Travis J

2
На старому IE, el.textContentбуде undefinedі el.innerTextможе бути "". Але "" || undefinedє undefined. Використання el.innerText || el.textContent || ''може бути краще.
Оріол

3
innerText не повертає прихований текст та вміст тегів сценарію / стилю, тоді як textContent робить. Якщо ви користуєтеся версією IE, яка підтримує textContent, можливо, спочатку краще використовувати її, так el.textContent || el.innerText || "".
Доміно

2
Просто примітка для тих, хто читає цю відповідь в наш час, через шість років після цієї відповіді, в ці дні ви можете просто скористатися var text = element.textContent;; якщо з якихось нечестивих причин вам все-таки потрібно підтримувати IE8 або нижче .
Марний код

el.innerTextприблизно такий же, як el.textContent.replace(/\W+/g, ' '). Вони не однакові.
Полв

26

Якщо ви можете використовувати jquery, то його просто

$("#txt").text()

8
Я просто мушу сказати, подивіться на всі чисті відповіді JS, а потім подивіться на цей. Це друга найважливіша причина, чому я використовую jQuery (тобто це спрощує завдання, зменшує моє навантаження та збільшує читабельність). Перша найважливіша причина (для мене) полягає в тому, що вона обробляє багато питань перехресної сумісності, я, можливо, інакше навіть не знаю (як, наприклад, використання jQuery для регулювання непрозорості, так що мені не потрібно писати окремий рядок тільки для IE8 для націлювання filterвласності я знаю , що чистий JS є технічно більш ефективним , коли мова йде про швидкість, але це навряд чи має значення більше в більшості нормально ...
VoidKing

8
pure 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;
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.