Wie bekomme ich den reinen Text ohne HTML-Element mit JavaScript?

122

Ich habe die 1-Schaltfläche und etwas Text in meinem HTML wie folgt:

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>

Wenn der Benutzer auf die Schaltfläche klickt, wird der Inhalt in <p id='txt'>dem folgenden erwarteten Ergebnis:

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

Kann mir jemand helfen, wie man die JavaScript-Funktion schreibt?

Danke dir.

John
quelle
Beantwortet das deine Frage? HTML aus Text JavaScript
entfernen

Antworten:

73

[2017.07.25] , da dies die akzeptierte Antwort auf weiterhin, trotz einer sehr hacky Lösung zu sein, ich bin Einbeziehung Gabi ‚s Code hinein, meine eigenen zu verlassen als schlechtes Beispiel zu dienen.

<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
quelle
3
Schlecht, weil hackig und langsam. Gibt es überhaupt eine Garantie dafür, dass der gerenderte Text selbst niemals Tags enthalten darf?
Domi
1
Nein, es gibt keine solche Garantie. Ich habe einen Haftungsausschluss gegeben, als ich gepostet habe. es diente offenbar dem Zweck des OP.
jcomeau_ictx
3
Der Versuch, HTML mit regulären Ausdrücken zu analysieren, ist wirklich gefährlich - es ist praktisch unmöglich (ich vermute, dass es theoretisch unmöglich ist), es richtig zu machen. Es gibt zu viele Randfälle, und dann explodiert Ihr Code, wenn Sie mit seltsamen Eingaben konfrontiert werden, die häufig für XSS ausgenutzt werden können.
David gegeben
2
Ich vermute, warum es akzeptiert wurde: Es ist eine vollständige Antwort, die sofort ausgeschnitten und eingefügt werden kann, so wie sie ist, in eine HTML-Datei und mit einem Browser getestet. Ich habe nie gesagt, dass es eine gute Antwort ist. Nachdem ich gesehen hatte, dass alle guten Antworten da waren und nicht akzeptiert wurden, schrieb ich , dass das OP ein wenig Handarbeit brauchte. Es ist immer noch gut genug für jede Anwendung, für die die HTML-Quelle bereits bekanntermaßen keine unausgeglichenen spitzen Klammern enthält.
jcomeau_ictx
211

Sie können dies verwenden:

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

Je nachdem, was Sie benötigen, können Sie entweder element.innerTextoder verwenden element.textContent. Sie unterscheiden sich in vielerlei Hinsicht. innerTextversucht zu approximieren, was passieren würde, wenn Sie auswählen, was Sie sehen (gerendertes HTML) und es in die Zwischenablage kopieren, während Sie textContenteinfach die HTML-Tags entfernen und Ihnen geben, was noch übrig ist.

innerText hat auch Kompatibilität mit alten IE-Browsern (kam von dort).

Gabi Purcaru
quelle
3
+1 - Ich habe nach einer Hochleistungsmethode gesucht text, da sie viel in einer Schleife erledigt wird. jQuery war nicht performant genug, aber das ging sehr schnell. Arbeitete in IE8 +, Chrom, ff. Perfekt.
Travis J
2
Auf alten IE el.textContentwird undefinedund el.innerTextkönnte sein "". Ist "" || undefinedaber undefined. Verwenden el.innerText || el.textContent || ''kann besser sein.
Oriol
3
innerText gibt keinen versteckten Text und Inhalt von Skript- / Stil-Tags zurück, während textContent dies tut. Wenn Sie eine Version von IE verwenden, die textContent unterstützt, ist es möglicherweise vorzuziehen, diese zuerst zu verwenden el.textContent || el.innerText || "".
Domino
2
Nur eine Notiz für jeden, der diese Antwort heute, mehr als sechs Jahre nach dieser Antwort, liest. Heutzutage können Sie sie einfach verwenden var text = element.textContent;. es sei denn, Sie müssen aus irgendeinem gottlosen Grund noch IE8 oder niedriger unterstützen .
Nutzloser Code
el.innerTextist ungefähr das gleiche wie el.textContent.replace(/\W+/g, ' '). Sie sind nicht gleich.
Polv
26

Wenn Sie jquery verwenden können, ist es einfach

$("#txt").text()
Sarath
quelle
8
Ich muss nur sagen, schau dir alle reinen JS-Antworten an und dann schau dir diese an. Dies ist der zweitwichtigste Grund, warum ich jQuery verwende (dh es vereinfacht Aufgaben, reduziert meine Arbeitsbelastung und erhöht die Lesbarkeit). Der erste wichtige Grund (für mich) ist, dass es viele Kompatibilitätsprobleme behandelt, die mir sonst möglicherweise gar nicht bewusst sind (z. B. die Verwendung von jQuery zum Anpassen der Deckkraft, sodass ich nicht nur für IE8 eine separate Zeile schreiben muss die Ziel filterEigenschaft ich weiß , dass reine JS technisch effizienter ist , wenn es um Geschwindigkeit geht, aber das spielt kaum eine Rolle mehr in den meisten normalen ...
VoidKing
8
reines js einzeiliges Äquivalent: document.querySelector("#txt").innerText;Menschen schließen die gesamte jQuery-Bibliothek viel zu oft ein, wenn sie nur ein paar Codezeilen benötigen. Es ist eine schlechte Praxis.
Levi Johansen
10

Diese Antwort funktioniert, um nur den Text für jedes HTML-Element zu erhalten.

Dieser erste Parameter "Knoten" ist das Element, von dem der Text abgerufen werden soll. Der zweite Parameter ist optional. Wenn true, wird ein Leerzeichen zwischen den Texten innerhalb der Elemente eingefügt, wenn dort sonst kein Leerzeichen vorhanden wäre.

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
quelle
2

Je nachdem, was Sie benötigen, können Sie entweder element.innerTextoder verwenden element.textContent. Sie unterscheiden sich in vielerlei Hinsicht. innerTextversucht zu approximieren, was passieren würde, wenn Sie auswählen, was Sie sehen (gerendertes HTML) und es in die Zwischenablage kopieren, während Sie textContenteinfach die HTML-Tags entfernen und Ihnen geben, was noch übrig ist.

innerText wird nicht mehr nur für den Internet Explorer verwendet und wird in allen gängigen Browsern unterstützt . Im Gegensatz dazu textContentist es natürlich mit alten IE-Browsern kompatibel (seitdem sie darauf gekommen sind).

Vollständiges Beispiel (aus Gabis Antwort ):

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

Dies funktioniert für mich kompiliert basierend auf dem, was hier mit einem moderneren Standard gesagt wurde. Dies funktioniert am besten für mehrere Suchvorgänge.

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

Das sollte funktionieren:

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

Versuchen Sie diese Geige: http://jsfiddle.net/7gnyc/2/

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

Das sollte es tun.


quelle
0

Versuchen Sie es (Kurzversion der Gabi- Antwortidee )

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

Kamil Kiełczewski
quelle