Jak uzyskać czysty tekst bez elementu HTML za pomocą JavaScript?


122

Mam przycisk 1 i trochę tekstu w moim HTML, jak poniżej:

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>

Gdy użytkownik kliknie przycisk, zawartość w <p id='txt'>pliku stanie się następującym oczekiwanym wynikiem:

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

Czy ktoś może mi pomóc, jak napisać funkcję JavaScript?

Dziękuję Ci.


Czy to odpowiada na twoje pytanie?
Usuń

Odpowiedzi:


73

[2017-07-25] Ponieważ jest to nadal akceptowana odpowiedź, mimo że jest to bardzo hakerskie rozwiązanie, włączam do niego kod Gabi , zostawiając swój własny, aby służyć jako zły przykład.

<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
Złe, bo hacky i powolne. Czy istnieje gwarancja, że ​​sam renderowany tekst nie może nigdy zawierać tagów?
Domi

1
nie, nie ma takiej gwarancji. Dałem wyłączenie odpowiedzialności, kiedy opublikowałem. najwyraźniej służył celowi PO.
jcomeau_ictx

3
Próba parsowania kodu HTML za pomocą wyrażeń regularnych jest naprawdę niebezpieczna - jest praktycznie niemożliwa (podejrzewam, że może to być teoretycznie niemożliwe), aby uzyskać poprawny wynik. Jest zbyt wiele przypadków skrajnych, a kod wysadza się w obliczu dziwnych danych wejściowych, które często można wykorzystać do wykonania XSS.
David Given

2
zgaduję, dlaczego została zaakceptowana: jest to pełna odpowiedź, którą można natychmiast wyciąć i wkleić w pliku html i przetestować za pomocą przeglądarki. Nigdy nie powiedziałem, że to dobra odpowiedź. Wysłałem post po tym, jak zobaczyłem, że wszystkie dobre odpowiedzi są dostępne i nie zostały zaakceptowane, i doszedłem do wniosku, że PO wymaga trochę trzymania się za rękę. nadal jest wystarczająco dobry dla każdej aplikacji, dla której już wiadomo, że źródło HTML nie zawiera niezrównoważonych nawiasów ostrych.
jcomeau_ictx

211

Możesz użyć tego:

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

W zależności od potrzeb możesz użyć opcji element.innerTextlub element.textContent. Różnią się na wiele sposobów. innerTextpróbuje w przybliżeniu oszacować, co by się stało, gdybyś wybrał to, co widzisz (wyrenderowany html) i skopiował to do schowka, podczas gdy textContentpo prostu usuwa tagi HTML i daje ci to, co zostało.

innerText ma również kompatybilność ze starymi przeglądarkami IE (stamtąd).


3
+1 - Szukałem jakiejś textmetody o wysokiej wydajności , ponieważ robi się dużo w pętli. jQuery nie był wystarczająco wydajny, ale był bardzo szybki. Pracował w IE8 +, chrome, ff. Idealny.
Travis J

2
Na starym IE el.textContentbędzie undefinedi el.innerTextmoże być "". Ale "" || undefinedjest undefined. Używanie el.innerText || el.textContent || ''może być lepsze.
Oriol

3
innerText nie zwraca ukrytego tekstu i zawartości tagów script / style, podczas gdy textContent to robi. Jeśli korzystasz z wersji IE, która obsługuje textContent, może być lepiej, aby użyć jej najpierw, więc el.textContent || el.innerText || "".
Domino

2
Tylko uwaga dla każdego, kto czyta tę odpowiedź w dzisiejszych czasach, ponad sześć lat po tej odpowiedzi, w dzisiejszych czasach możesz po prostu użyć var text = element.textContent;; chyba że z jakiegoś bezbożnego powodu nadal musisz wspierać IE8 lub starsze .
Bezużyteczny kod

el.innerTextjest mniej więcej taki sam jak el.textContent.replace(/\W+/g, ' '). One nie są takie same.
Polv

26

Jeśli możesz użyć jquery, to jest to proste

$("#txt").text()

8
Muszę tylko powiedzieć, spójrz na wszystkie czyste odpowiedzi JS, a następnie spójrz na tę. To drugi najważniejszy powód, dla którego używam jQuery (tj. Upraszcza to zadania, zmniejsza obciążenie pracą i zwiększa czytelność). Pierwszym najważniejszym powodem (dla mnie) jest to, że rozwiązuje wiele problemów z kompatybilnością krzyżową, o których w przeciwnym razie mógłbym nawet nie być świadomy (na przykład użycie jQuery do dostosowania krycia, aby nie musieć pisać osobnej linii tylko dla IE8 skierowanie filterwłasność wiem, że czysty JS jest technicznie bardziej efektywne, jeśli chodzi o szybkość, ale to nie ma znaczenia już w najbardziej normalne ...
VoidKing

8
pure js One liner odpowiednik: document.querySelector("#txt").innerText;ludzie zbyt często dołączają całą bibliotekę jQuery, gdy ich jedyną potrzebą jest kilka linii kodu. To zła praktyka.
Levi Johansen

10

Ta odpowiedź będzie działać, aby uzyskać tylko tekst dla dowolnego elementu HTML.

Ten pierwszy parametr „węzeł” jest elementem, z którego ma zostać pobrany tekst. Drugi parametr jest opcjonalny i jeśli true doda spację między tekstem w elementach, jeśli w przeciwnym razie nie byłoby tam spacji.

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

W zależności od potrzeb możesz użyć opcji element.innerTextlub element.textContent. Różnią się na wiele sposobów. innerTextpróbuje w przybliżeniu oszacować, co by się stało, gdybyś wybrał to, co widzisz (wyrenderowany html) i skopiował to do schowka, podczas gdy textContentpo prostu usuwa tagi HTML i daje ci to, co zostało.

innerText jest już używany nie tylko dla IE i jest obsługiwany we wszystkich głównych przeglądarkach . Oczywiście w przeciwieństwie do textContenttego ma kompatybilność ze starymi przeglądarkami IE (od kiedy to wymyślili).

Pełny przykład (z odpowiedzi Gabi ):

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

2

To działa dla mnie skompilowane na podstawie tego, co zostało tutaj powiedziane, z bardziej nowoczesnym standardem. Działa to najlepiej w przypadku wielu wyszukiwań.

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

1

To powinno działać:

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

Spróbuj tego skrzypiec: 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;
}

Że należy to zrobić.


0

Spróbuj (krótka wersja pomysłu na odpowiedź Gabi )

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


0

Chcesz zmienić I am working in ABC company.TO I am working in ABC company.. To są te same ciągi, więc nie widzę powodu, aby to zrobić, ale możesz to zrobić za pomocą JavaScript innerHTMLlub textContent.

element.innerHTMLto właściwość definiująca kod HTML wewnątrz elementu. Jeśli wpiszesz element.innerHTML = "<strong>This is bold</strong>, tekst „To jest pogrubiony” zostanie pogrubiony.

element.textContentz drugiej strony ustawia tekst w elemencie. Jeśli użyjesz element.textContent = "<strong>This is bold</strong>, tekst „To jest pogrubione” nie będzie pogrubiony. Użytkownik dosłownie zobaczy tekst „ To jest pogrubione

W twoim przypadku możesz użyć jednego z nich. Użyję .textContent. Kod do zmiany <p>elementu znajduje się poniżej.

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>

To niestety nie zmieni tego, ponieważ zmieni to na ten sam dokładny tekst. Możesz zaryzykować, zmieniając napis „Pracuję w firmie ABC”. na coś innego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.