Bagaimana cara mendapatkan teks murni tanpa elemen HTML menggunakan JavaScript?

122

Saya memiliki tombol 1 dan beberapa teks di HTML saya seperti berikut:

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>

Ketika pengguna mengklik tombol, konten di <p id='txt'>akan menjadi hasil yang diharapkan sebagai berikut:

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

Adakah yang bisa membantu saya bagaimana menulis fungsi JavaScript?

Terima kasih.

John
sumber
Apakah ini menjawab pertanyaan Anda?
Hapus

Jawaban:

73

[25-07-2017] karena ini terus menjadi jawaban yang diterima, meskipun merupakan solusi yang sangat meretas, saya memasukkan kode Gabi ke dalamnya, meninggalkan kode saya sendiri sebagai contoh yang buruk.

<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
sumber
3
Buruk karena hacky dan lambat. Apakah ada jaminan bahwa teks yang dirender itu sendiri tidak boleh berisi tag?
Domi
1
tidak, tidak ada jaminan seperti itu. Saya memberikan penafian saat saya memposting. itu tampaknya melayani tujuan OP.
jcomeau_ictx
3
Mencoba mengurai HTML dengan ekspresi reguler sangat berbahaya --- secara praktis tidak mungkin (saya kira secara teoritis tidak mungkin) untuk melakukannya dengan benar. Ada terlalu banyak kasus tepi dan kemudian kode Anda meledak ketika dihadapkan dengan input aneh, yang sering dapat dieksploitasi untuk melakukan XSS.
David Diberikan
2
tebakan saya mengapa itu diterima: ini adalah jawaban lengkap, yang dapat langsung dipotong-dan-tempel seperti ke dalam file html dan diuji dengan browser. Saya tidak pernah mengatakan itu adalah jawaban yang bagus . Saya memposting setelah melihat semua jawaban bagus ada di sana, dan tidak diterima, dan mengira OP perlu sedikit pegangan. ini masih cukup baik untuk aplikasi apa pun yang sumber HTML-nya sudah diketahui tidak berisi tanda kurung siku yang tidak seimbang.
jcomeau_ictx
211

Anda dapat menggunakan ini:

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

Bergantung pada apa yang Anda butuhkan, Anda dapat menggunakan element.innerTextatau element.textContent. Mereka berbeda dalam banyak hal. innerTextmencoba untuk memperkirakan apa yang akan terjadi jika Anda memilih apa yang Anda lihat (rendered html) dan menyalinnya ke clipboard, sementara textContentsemacam hanya menghapus tag html dan memberi Anda apa yang tersisa.

innerText juga memiliki kompatibilitas dengan browser IE lama (berasal dari sana).

Gabi Purcaru
sumber
3
+1 - Sedang mencari beberapa textmetode berkinerja tinggi karena itu dilakukan banyak dalam satu putaran. jQuery tidak cukup berkinerja, tapi ini sangat cepat. Bekerja di IE8 +, chrome, ff. Sempurna.
Travis J
2
Di IE lama, el.textContentakan undefineddan el.innerTextmungkin "". Tapi "" || undefinedapakah undefined. Menggunakan el.innerText || el.textContent || ''mungkin lebih baik.
Oriol
3
innerText tidak mengembalikan teks tersembunyi dan konten tag skrip / gaya sementara textContent melakukannya. Jika Anda menggunakan versi IE yang mendukung textContent, mungkin lebih baik untuk menggunakannya terlebih dahulu, jadi el.textContent || el.innerText || "".
Domino
2
Sekadar catatan bagi siapa pun yang membaca jawaban ini di masa sekarang, lebih dari enam tahun setelah jawaban ini, hari-hari ini Anda bisa menggunakan var text = element.textContent;; kecuali untuk beberapa alasan yang tidak saleh Anda masih harus mendukung IE8 atau lebih rendah .
Kode Tidak Berguna
el.innerTextkira-kira sama dengan el.textContent.replace(/\W+/g, ' '). Mereka tidaklah sama.
Polv
26

Jika Anda bisa menggunakan jquery maka itu sederhana

$("#txt").text()
Sarath
sumber
8
Saya hanya harus mengatakan, lihat semua jawaban JS murni dan kemudian lihat yang ini. Ini adalah alasan terpenting kedua mengapa saya menggunakan jQuery (yaitu, ini menyederhanakan tugas, mengurangi beban kerja saya, dan meningkatkan keterbacaan). Alasan terpenting pertama (bagi saya) adalah karena menangani banyak masalah kompatibilitas silang, jika tidak saya mungkin tidak menyadarinya (seperti menggunakan jQuery untuk menyesuaikan opacity, sehingga saya tidak perlu menulis baris terpisah hanya untuk IE8 untuk menargetkan filterproperti. Saya tahu bahwa JS murni secara teknis lebih efisien dalam hal kecepatan, tetapi itu tidak lagi menjadi masalah di kebanyakan orang normal ..
VoidKing
8
setara dengan pure js one liner: document.querySelector("#txt").innerText;Orang-orang terlalu sering menyertakan seluruh pustaka jQuery ketika mereka hanya membutuhkan beberapa baris kode. Itu praktik yang buruk.
Levi Johansen
10

Jawaban ini akan berfungsi untuk mendapatkan teks untuk setiap elemen HTML.

Parameter "node" pertama ini adalah elemen untuk mendapatkan teks. Parameter kedua adalah opsional dan jika true akan menambahkan spasi di antara teks di dalam elemen jika tidak ada spasi di sana.

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

Bergantung pada apa yang Anda butuhkan, Anda dapat menggunakan element.innerTextatau element.textContent. Mereka berbeda dalam banyak hal. innerTextmencoba untuk memperkirakan apa yang akan terjadi jika Anda memilih apa yang Anda lihat (rendered html) dan menyalinnya ke clipboard, sementara textContentsemacam hanya menghapus tag html dan memberi Anda apa yang tersisa.

innerText tidak hanya digunakan untuk IE lagi , dan didukung di semua browser utama . Tentu saja, tidak seperti textContent, ia memiliki kesesuaian dengan browser IE lama (sejak mereka memunculkannya).

Contoh lengkap (dari jawaban Gabi ):

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

Ini bekerja untuk saya yang disusun berdasarkan apa yang dikatakan di sini dengan standar yang lebih modern. Ini berfungsi paling baik untuk beberapa pencarian.

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

Itu seharusnya berhasil:

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

Coba biola ini: http://jsfiddle.net/7gnyc/2/

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

Itu harus dilakukan.


sumber
0

Coba (versi singkat dari ide jawaban Gabi )

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

Kamil Kiełczewski
sumber