JavaScript kullanarak HTML öğesi olmadan saf metin nasıl elde edilir?


122

1 düğmesi ve HTML’imde aşağıdaki gibi bir metin var:

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>

Kullanıcı düğmeyi tıkladığında, içindeki içerik <p id='txt'>aşağıdaki beklenen sonuç olacaktır:

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

Biri bana JavaScript işlevini nasıl yazmam konusunda yardım edebilir mi?

Teşekkür ederim.


Bu sorunuzu yanıtlıyor mu? Metin JavaScript'ten HTML'yi
Çıkarın

Yanıtlar:


73

Bu çok hacky çözüm olmasına rağmen, kabul cevabı olmaya devam beri [2017/07/25], ben dahil ediyorum Gabi kötü örnek teşkil etmek benim kendi bırakarak içine 'ın kodunu.

<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
Kötü çünkü huysuz ve yavaş. Oluşturulan metnin kendisinin asla etiket içermemesinin bir garantisi var mı?
Domi

1
hayır, böyle bir garanti yok. Gönderdiğimde bir sorumluluk reddi beyanı verdim. Görünüşe göre OP'nin amacına hizmet etti.
jcomeau_ictx

3
HTML'yi normal ifadelerle ayrıştırmaya çalışmak gerçekten tehlikelidir - doğruyu yapmak neredeyse imkansızdır ( teorik olarak imkansız olabileceğinden şüpheleniyorum ). Çok fazla uç durum var ve sonra kodunuz garip girdilerle karşı karşıya kaldığında patlıyor, bu da XSS yapmak için sıklıkla kullanılabiliyor.
David

2
neden kabul edildiğine dair tahminim: tam bir cevap, olduğu gibi hemen kesilip yapıştırılabildiği gibi bir html dosyası ve bir tarayıcı ile test edilebilir. Bunun iyi bir cevap olduğunu asla söylemedim . Tüm iyi cevapların orada olduğunu ve kabul edilmediğini gördükten sonra mesaj gönderdim ve OP'nin biraz el sıkışması gerektiğini düşündüm. HTML kaynağının dengesiz açılı parantez içermediği zaten bilinen herhangi bir uygulama için hala yeterince iyidir.
jcomeau_ictx

211

Bunu kullanabilirsiniz:

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

İhtiyacınız olan şeye bağlı olarak element.innerTextveya kullanabilirsiniz element.textContent. Birçok yönden farklılık gösterirler. innerTextGördüğünüzü seçip panoya kopyalarsanız ne olacağını tahmin etmeye çalışır, bu sırada textContenthtml etiketlerini çıkarır ve size kalanları verir.

innerText ayrıca eski IE tarayıcıları ile de uyumludur (oradan geldi).


3
+1 - textBir döngüde çok şey yapıldığı için yüksek performanslı bir yöntem arıyordu . jQuery yeterince performanslı değildi, ancak bu çok hızlıydı. IE8 +, chrome, ff'de çalıştı. Mükemmel.
Travis J

2
Eski IE'de, el.textContentolacak undefinedve el.innerTextolabilir "". Ama "" || undefinedöyle undefined. Kullanmak el.innerText || el.textContent || ''daha iyi olabilir.
Oriol

3
innerText, textContent döndürürken gizli metin ve komut dosyası / stil etiketlerinin içeriğini döndürmez. TextContent'i destekleyen bir IE sürümündeyseniz, önce onu kullanmak tercih edilebilir, bu yüzden el.textContent || el.innerText || "".
Domino

2
Günümüzde bu cevabı okuyan herkes için sadece bir not, bu cevabın üzerinden altı yıldan fazla bir süre sonra, bugünlerde sadece kullanabilirsiniz var text = element.textContent;; bazı mantıksız nedenlerden dolayı hala IE8 veya altını desteklemeniz gerekmedikçe .
Yararsız Kod

el.innerTextkabaca aynıdır el.textContent.replace(/\W+/g, ' '). Aynı değiller.
Polv

26

Jquery kullanabiliyorsanız, o zaman basit

$("#txt").text()

8
Sadece şunu söylemeliyim, tüm saf JS cevaplarına bak ve sonra buna bak. Bu, jQuery kullanmamın ikinci en önemli nedenidir (yani, görevleri basitleştirir, iş yükümü azaltır ve okunabilirliği artırır). İlk en önemli neden (benim için) birçok çapraz uyumluluk sorununu ele almasıdır, aksi takdirde farkında bile olmayabilirim (opaklığı ayarlamak için jQuery kullanmak gibi, böylece sadece IE8 için ayrı bir satır yazmak zorunda kalmayayım) filtermülkü hedeflemek için . Saf JS'nin hız söz konusu olduğunda teknik olarak daha verimli olduğunu biliyorum, ancak çoğu normal durumda artık önemi yok ..
VoidKing

8
pure js tek document.querySelector("#txt").innerText;satırlık eşdeğer: İnsanlar, tek ihtiyaçları birkaç satır kod olduğunda, tüm jQuery kitaplığını çok sık dahil ederler. Bu kötü bir uygulama.
Levi Johansen

10

Bu cevap, herhangi bir HTML öğesi için yalnızca metni elde etmeye çalışacaktır.

Bu ilk parametre "node", metnin alınacağı öğedir. İkinci parametre isteğe bağlıdır ve eğer doğruysa, aksi halde orada boşluk olmayacaksa, öğeler içindeki metin arasına bir boşluk ekler.

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

İhtiyacınız olan şeye bağlı olarak element.innerTextveya kullanabilirsiniz element.textContent. Birçok yönden farklılık gösterirler. innerTextGördüğünüzü seçip panoya kopyalarsanız ne olacağını tahmin etmeye çalışır, bu sırada textContenthtml etiketlerini çıkarır ve size kalanları verir.

innerText artık sadece IE için kullanılmıyor ve tüm büyük tarayıcılarda destekleniyor . Tabii ki, aksine textContent, eski IE tarayıcıları ile uyumludur (bulduklarından beri).

Tam örnek ( Gabi'nin cevabından ):

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

2

Bu benim için çalışıyor, burada söylenenlere göre daha modern bir standartla derlendi. Bu, çoklu aramalarda en iyi sonucu verir.

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

1

Bu işe yaramalı:

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

Bu keman deneyin: 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;
}

Bunu yapmalı.


0

Deneyin (Gabi cevap fikrinin kısa versiyonu )

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.