Come ottenere il testo puro senza elemento HTML utilizzando JavaScript?


122

Ho il pulsante 1 e del testo nel mio HTML come il seguente:

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>

Quando l'utente fa clic sul pulsante, il contenuto in <p id='txt'>diventerà il seguente risultato atteso:

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

Qualcuno può aiutarmi a scrivere la funzione JavaScript?

Grazie.


Questo risponde alla tua domanda? Rimuovi HTML dal testo JavaScript
KyleMit

Risposte:


73

[2017-07-25] poiché questa continua ad essere la risposta accettata, nonostante sia una soluzione molto hacker, sto incorporando il codice di Gabi in essa, lasciando il mio a servire da cattivo esempio.

<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
Male perché hacky e lento. Esiste anche una garanzia che il testo visualizzato stesso non debba mai contenere tag?
Domi

1
no, non esiste tale garanzia. Ho fornito un disclaimer quando ho pubblicato. apparentemente serviva allo scopo dell'OP.
jcomeau_ictx

3
Cercare di analizzare l'HTML con espressioni regolari è davvero pericoloso: è praticamente impossibile (sospetto che possa essere teoricamente impossibile) da ottenere. Ci sono troppi casi limite e quindi il tuo codice esplode di fronte a strani input, che possono essere spesso sfruttati per eseguire XSS.
David dato il

2
la mia ipotesi sul motivo per cui è stato accettato: è una risposta completa, che può essere immediatamente tagliata e incollata così com'è in un file html e testata con un browser. Non ho mai detto che fosse una buona risposta. Ho postato dopo aver visto che tutte le buone risposte erano lì, e non accettate, e ho pensato che l'OP avesse bisogno di un piccolo appiglio. è ancora abbastanza buono per qualsiasi applicazione per la quale il sorgente HTML è già noto per non contenere parentesi angolari sbilanciate.
jcomeau_ictx

211

Puoi usare questo:

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

A seconda di ciò di cui hai bisogno, puoi usare element.innerTexto element.textContent. Differiscono in molti modi. innerTextcerca di approssimare ciò che accadrebbe se selezionassi ciò che vedi (reso html) e lo copiassi negli appunti, mentre in textContentqualche modo rimuove i tag html e ti dà ciò che è rimasto.

innerText ha anche la compatibilità con i vecchi browser IE (è venuto da lì).


3
+1 - Stavo cercando un textmetodo ad alte prestazioni poiché viene fatto molto in un ciclo. jQuery non era abbastanza performante, ma era molto veloce. Ha funzionato in IE8 +, chrome, ff. Perfetto.
Travis J

2
Sul vecchio IE, el.textContentsarà undefinede el.innerTextpotrebbe essere "". Ma lo "" || undefinedè undefined. L'utilizzo el.innerText || el.textContent || ''potrebbe essere migliore.
Oriol

3
innerText non restituisce il testo nascosto e il contenuto dei tag di script / stile mentre textContent lo fa. Se sei su una versione di IE che supporta textContent, potrebbe essere preferibile usarlo prima, quindi el.textContent || el.innerText || "".
Domino

2
Solo una nota per chiunque legga questa risposta ai giorni nostri, più di sei anni dopo questa risposta, in questi giorni puoi semplicemente usare var text = element.textContent;; a meno che per qualche motivo empio tu debba ancora supportare IE8 o inferiore .
Codice inutile

el.innerTextè più o meno lo stesso di el.textContent.replace(/\W+/g, ' '). Non sono la stessa cosa.
Polv

26

Se puoi usare jquery, è semplice

$("#txt").text()

8
Devo solo dire, guarda tutte le risposte JS pure e poi guarda questa. Questo è il secondo motivo più importante per cui utilizzo jQuery (ovvero, semplifica le attività, riduce il carico di lavoro e aumenta la leggibilità). Il primo motivo più importante (per me) è perché gestisce molti problemi di compatibilità incrociata, altrimenti potrei non esserne nemmeno a conoscenza (come usare jQuery per regolare l'opacità, in modo da non dover scrivere una riga separata solo per IE8 per indirizzare la filterproprietà. So che il JS puro è tecnicamente più efficiente quando si tratta di velocità, ma questo non ha quasi più importanza nella maggior parte dei normali ..
VoidKing

8
puro js one liner equivalente: le document.querySelector("#txt").innerText;persone includono l'intera libreria jQuery troppo spesso quando il loro unico bisogno è un paio di righe di codice. È una cattiva pratica.
Levi Johansen

10

Questa risposta funzionerà per ottenere solo il testo per qualsiasi elemento HTML.

Questo primo parametro "nodo" è l'elemento da cui ottenere il testo. Il secondo parametro è facoltativo e, se true, aggiungerà uno spazio tra il testo all'interno degli elementi se altrimenti non esisterebbe spazio.

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

A seconda di ciò di cui hai bisogno, puoi usare element.innerTexto element.textContent. Differiscono in molti modi. innerTextcerca di approssimare ciò che accadrebbe se selezionassi ciò che vedi (reso html) e lo copiassi negli appunti, mentre in textContentqualche modo rimuove i tag html e ti dà ciò che è rimasto.

innerText non è più utilizzato solo per IE ed è supportato in tutti i principali browser . Ovviamente, a differenza textContent, è compatibile con i vecchi browser IE (da quando lo hanno inventato).

Esempio completo (dalla risposta di Gabi ):

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

2

Questo funziona per me compilato in base a ciò che è stato detto qui con uno standard più moderno. Funziona meglio per più ricerche.

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

1

Dovrebbe funzionare:

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

Prova questo violino: 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;
}

Dovrebbe bastare.


0

Prova (versione breve dell'idea di risposta di Gabi )

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.