Comment obtenir le texte pur sans élément HTML en utilisant JavaScript?

122

J'ai le bouton 1 et du texte dans mon HTML comme suit:

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>

Lorsque l'utilisateur clique sur le bouton, le contenu de la <p id='txt'>deviendra le résultat attendu suivant:

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

Quelqu'un peut-il m'aider à écrire la fonction JavaScript?

Je vous remercie.

John
la source
Est-ce que cela répond à votre question?
Supprimer le

Réponses:

73

[2017-07-25] puisque cela continue d'être la réponse acceptée, bien que ce soit une solution très piratée, j'y incorpore le code de Gabi , laissant le mien pour servir de mauvais exemple.

<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>
jcomeau_ictx
la source
3
Mauvais parce que piraté et lent. Y a-t-il même une garantie que le texte rendu lui-même ne doit jamais contenir de balises?
Domi
1
non, une telle garantie n'existe pas. J'ai donné un avertissement lors de ma publication. cela servait apparemment l'objectif du PO.
jcomeau_ictx
3
Essayer d'analyser du HTML avec des expressions régulières est vraiment dangereux - il est pratiquement impossible (je soupçonne que cela peut être théoriquement impossible) de bien faire. Il y a trop de cas extrêmes et votre code explose face à une entrée étrange, qui peut fréquemment être exploitée pour faire du XSS.
David donné le
2
je devine pourquoi il a été accepté: c'est une réponse complète, qui peut être immédiatement copiée et collée telle quelle dans un fichier html et testée avec un navigateur. Je n'ai jamais dit que c'était une bonne réponse. J'ai posté après avoir vu que toutes les bonnes réponses étaient là, et non acceptées, et j'ai pensé que l'OP avait besoin d'un peu de prise en main. il est toujours suffisant pour toute application pour laquelle la source HTML est déjà connue pour ne pas contenir de crochets angulaires déséquilibrés.
jcomeau_ictx
211

Vous pouvez utiliser ceci:

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

En fonction de vos besoins, vous pouvez utiliser soit element.innerTextou element.textContent. Ils diffèrent à bien des égards. innerTextessaie de se rapprocher de ce qui se passerait si vous sélectionniez ce que vous voyez (rendu html) et le copiez dans le presse-papiers, tandis qu'en textContentquelque sorte , supprime simplement les balises html et vous donne ce qui reste.

innerText a également une compatibilité avec les anciens navigateurs IE (venus de là).

Gabi Purcaru
la source
3
+1 - Je cherchais une textméthode de haute performance car elle se fait beaucoup en boucle. jQuery n'était pas assez performant, mais c'était très rapide. A travaillé dans IE8 +, chrome, ff. Parfait.
Travis J
2
Sur l'ancien IE, el.textContentsera undefinedet el.innerTextpourrait être "". Mais "" || undefinedest undefined. En utilisantel.innerText || el.textContent || '' peut être meilleure.
Oriol
3
innerText ne renvoie pas le texte masqué et le contenu des balises de script / style, contrairement à textContent. Si vous utilisez une version d'IE qui prend en charge textContent, il peut être préférable de l'utiliser d'abord, donc el.textContent || el.innerText || "".
Domino
2
Juste une note pour quiconque lit cette réponse de nos jours, plus de six ans après cette réponse, ces jours-ci, vous pouvez simplement l'utiliser var text = element.textContent;; sauf pour une raison impie, vous devez toujours prendre en charge IE8 ou inférieur .
Code inutile
el.innerTextest à peu près le même que el.textContent.replace(/\W+/g, ' '). Ils ne sont pas les mêmes.
Polv
26

Si vous pouvez utiliser jquery, c'est simple

$("#txt").text()
Sarath
la source
8
Je dois juste dire, regardez toutes les réponses JS pures, puis regardez celle-ci. C'est la deuxième raison la plus importante pour laquelle j'utilise jQuery (c'est-à-dire qu'il simplifie les tâches, réduit ma charge de travail et augmente la lisibilité). La première raison la plus importante (pour moi) est qu'elle gère de nombreux problèmes de compatibilité croisée, dont je n'aurais peut-être même pas conscience (comme utiliser jQuery pour ajuster l'opacité, de sorte que je n'ai pas à écrire une ligne distincte juste pour IE8 pour cibler la filterpropriété. Je sais que le JS pur est techniquement plus efficace en
termes
8
pure js one liner équivalent: les document.querySelector("#txt").innerText;gens incluent bien trop souvent la bibliothèque jQuery entière quand leur seul besoin est de quelques lignes de code. C'est une mauvaise pratique.
Levi Johansen
10

Cette réponse fonctionnera pour obtenir uniquement le texte de tout élément HTML.

Ce premier paramètre "node" est l'élément à partir duquel obtenir le texte. Le deuxième paramètre est facultatif et s'il est vrai, il ajoutera un espace entre le texte dans les éléments si aucun espace n'existerait autrement.

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;
}
James
la source
2

En fonction de vos besoins, vous pouvez utiliser soit element.innerTextou element.textContent. Ils diffèrent à bien des égards. innerTextessaie de se rapprocher de ce qui se passerait si vous sélectionniez ce que vous voyez (rendu html) et le copiez dans le presse-papiers, tandis qu'en textContentquelque sorte , supprime simplement les balises html et vous donne ce qui reste.

innerText n'est plus seulement utilisé pour IE , et il est pris en charge dans tous les principaux navigateurs . Bien sûr, contrairement àtextContent , il est compatible avec les anciens navigateurs IE (depuis qu'ils l'ont inventé).

Exemple complet (de la réponse de Gabi ):

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

Cela fonctionne pour moi compilé sur la base de ce qui a été dit ici avec une norme plus moderne. Cela fonctionne mieux pour plusieurs recherches.

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

Cela devrait fonctionner:

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

Essayez ce violon: http://jsfiddle.net/7gnyc/2/

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

Ça devrait le faire.


la source
0

Essayez (version courte de l' idée de réponse de Gabi )

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

Kamil Kiełczewski
la source