Hapus tag HTML tetapi pertahankan innerHtml

148

Saya memiliki beberapa HTML sederhana yang saya perlukan untuk menghapus pemformatan sederhana.

A nice house was found in <b>Toronto</b>.

Saya perlu menghapus huruf tebal, tetapi membiarkan kalimatnya tetap utuh.

Bagaimana ini bisa dilakukan di jQuery?

Ian Vink
sumber

Jawaban:

302
$('b').contents().unwrap();

Ini memilih semua <b>elemen, lalu gunakan.contents() untuk menargetkan konten teks <b>, lalu.unwrap() untuk menghapus <b>elemen induknya .


Untuk performa terbaik, selalu gunakan versi asli:

var b = document.getElementsByTagName('b');

while(b.length) {
    var parent = b[ 0 ].parentNode;
    while( b[ 0 ].firstChild ) {
        parent.insertBefore(  b[ 0 ].firstChild, b[ 0 ] );
    }
     parent.removeChild( b[ 0 ] );
}

Ini akan jauh lebih cepat daripada solusi jQuery yang disediakan di sini.

pengguna113716
sumber
1
+1 Saya sedang duduk di sana menulis jawaban yang hampir identik mengenai unwrap()dan tidak bisa mengingat bagaimana mendapatkan bagian teks, lupa tentang .contents()- sangat baik.
Orbling
2
Meskipun ini berfungsi, itu juga cukup lambat dibandingkan dengan .replacewith()karena traversal DOM ekstra ... jika itu hanya <b>tag dengan HTML, ia menjadi lebih cepat.
Nick Craver
Juga, jika Anda hanya ingin membuka bentang rentang atau tag font tertentu, Anda dapat melakukan sesuatu seperti ini: $ (". ClassName font"). Content (). Unwrap ();
Steve Cochrane
jika html adalah <div> abc </div> abc break line tidak tahan? bagaimana saya bisa menahannya jika menggunakan <div> untuk break line? @ user113716
Hoa.Tran
1
Terima kasih, ini sangat membantu. Saya menambahkan parent.normalize()setelah parent.removeChild(...untuk menggabungkan node teks yang berdekatan. Ini bermanfaat jika Anda terus memodifikasi halaman.
Justin Harris
52

Anda juga dapat menggunakan .replaceWith(), seperti ini:

$("b").replaceWith(function() { return $(this).contents(); });

Atau jika Anda tahu itu hanya string:

$("b").replaceWith(function() { return this.innerHTML; });

Ini dapat membuat perbedaan besar jika Anda membuka banyak elemen karena kedua pendekatan di atas secara signifikan lebih cepat daripada biaya .unwrap().

Nick Craver
sumber
Nick, aku juga sangat suka jawabanmu. Saya memilih yang lain karena jumlah tag / teks yang akan saya gunakan untuk ini di aplikasi iPad saya (data lokal) kecil sehingga kinerjanya tidak terlalu penting. Jawaban Partick sedikit lebih sederhana untuk saya pertahankan. Memisahkan rambut pada 2 solusi hebat, tapi saya hanya bisa memberikan satu cek.
Ian Vink
1
@ BahaiResearch.com - Jika kinerja bukan masalah maka benar-benar sederhana ... Saya hanya menyediakan ini untuk orang lain yang menemukannya nanti yang mungkin khawatir tentang hal itu :)
Nick Craver
Saya mencoba menggunakan contoh ini dengan kotak teks tetapi itu membunuh saya karena konten di dalamnya adalah tag html yang ingin saya evaluasi dan tidak hanya ditampilkan sebagai teks. Saya akhirnya menggunakan: $ ('textarea'). ReplaceWith (function () {return $ (this) .val ();});
Will Sampson
13

Cara paling sederhana untuk menghapus elemen html dalam dan mengembalikan hanya teks adalah fungsi JQuery .text () .

Contoh:

var text = $('<p>A nice house was found in <b>Toronto</b></p>');

alert( text.html() );
//Outputs A nice house was found in <b>Toronto</b>

alert( text.text() );
////Outputs A nice house was found in Toronto

Demo jsFiddle

WebChemist
sumber
5

Bagaimana dengan ini?

$("b").insertAdjacentHTML("afterend",$("b").innerHTML);
$("b").parentNode.removeChild($("b"));

Baris pertama menyalin konten HTML dari btag ke lokasi langsung setelah btag, dan kemudian baris kedua menghapus btag dari DOM, hanya menyisakan konten yang disalin.

Saya biasanya membungkus ini menjadi fungsi untuk membuatnya lebih mudah digunakan:

function removeElementTags(element) {
   element.insertAdjacentHTML("afterend",element.innerHTML);
   element.parentNode.removeChild(element);
}

Semua kode sebenarnya Javascript murni, satu-satunya JQuery yang digunakan adalah untuk memilih elemen yang akan ditargetkan ( btag pada contoh pertama). Fungsinya hanya JS: D

Lihat juga:

Toastrackenigma
sumber
3
// For MSIE:
el.removeNode(false);

// Old js, w/o loops, using DocumentFragment:
function replaceWithContents (el) {
  if (el.parentElement) {
    if (el.childNodes.length) {
      var range = document.createRange();
      range.selectNodeContents(el);
      el.parentNode.replaceChild(range.extractContents(), el);
    } else {
      el.parentNode.removeChild(el);
    }
  }
}

// Modern es:
const replaceWithContents = (el) => {
  el.replaceWith(...el.childNodes);
};

// or just:
el.replaceWith(...el.childNodes);

// Today (2018) destructuring assignment works a little slower
// Modern es, using DocumentFragment.
// It may be faster than using ...rest
const replaceWithContents = (el) => {
  if (el.parentElement) {
    if (el.childNodes.length) {
      const range = document.createRange();
      range.selectNodeContents(el);
      el.replaceWith(range.extractContents());
    } else {
      el.remove();
    }
  }
};
redisko
sumber
1

Solusi asli lain (dalam kopi):

el = document.getElementsByTagName 'b'

docFrag = document.createDocumentFragment()
docFrag.appendChild el.firstChild while el.childNodes.length

el.parentNode.replaceChild docFrag, el

Saya tidak tahu apakah ini lebih cepat daripada solusi user113716, tetapi mungkin lebih mudah dimengerti untuk beberapa orang.

GijsjanB
sumber
1

Jawaban paling sederhana adalah hembusan pikiran:

outerHTML didukung hingga Internet Explorer 4!

Ini dia untuk melakukannya dengan javascript bahkan tanpa jQuery

function unwrap(selector) {
    var nodelist = document.querySelectorAll(selector);
    Array.prototype.forEach.call(nodelist, function(item,i){
        item.outerHTML = item.innerHTML; // or item.innerText if you want to remove all inner html tags 
    })
}

unwrap('b')

Ini harus bekerja di semua browser utama termasuk IE lama. di peramban baru-baru ini, kita bahkan dapat memanggil masing-masing tepat pada nodelist.

function unwrap(selector) {
    document.querySelectorAll('b').forEach( (item,i) => {
        item.outerHTML = item.innerText;
    } )
}
izzulmakin
sumber