Saya sudah mencoba mendeteksi apakah 'getSelection'.anchorNode.parentNode memiliki kelas bg-red, dan menggantinya, tetapi terlalu banyak efek samping yang muncul.
Jadi, solusinya dengan regexp ...
(* 1) - Jika Anda memeriksa kode elemen yang dapat diedit konten, Anda akan melihat strukturnya: Setiap baris baru adalah div terpisah. Anda harus mengganti setiap simbol baris baru \n
dengan HTML "pemecah garis", untuk memungkinkan pemilihan multi-baris.
(* 2) - Browser memasukkan koreksi sendiri ke HTML dan mencegah penggantian yang benar. Saya terpaksa memasukkan string Non-HTML, yang sepertinya tidak akan muncul dalam teks. Dan setelah semua penggantian - masukkan HTML yang valid.
(* 3) - Saya sarankan untuk menganalisis semua ekspresi reguler di sini → https://regex101.com/r/j88wc0/1 Gagasan utamanya adalah mengganti semua tampilan ganda <span class="bg-red"> anything instead of closing span <span class="bg-red">
atau </span> anything instead of starting span tag </span>
.
Perhatikan, bahwa kode ini menyegarkan semua innerHTML, setiap kali Anda menekan tombol. Ini tidak akan berfungsi juga dengan teks dari beberapa ribu baris)
let button = document.getElementById("button");
let block = document.getElementById("block");
button.addEventListener('click', function(){
let s = window.getSelection();
let str = s.toString().replace(/\n/g,'</span></div><div><span class="bg-red">'); // (*1)
document.execCommand("insertHTML", false, `bubufication`); // (*2)
block.innerHTML = block.innerHTML
.replace(/bubufication/, `<span class="bg-red">${str}</span>`)
.replace(/<span class="bg-red">(.*?)<\/span><span class="bg-red">/g,'$1<span class="bg-red">')
.replace(/<span class="bg-red">(((?!<\/span>).)*?<span class="bg-red">)/g,"$1")
.replace(/(<\/span>((?!<span class="bg-red">).)*)<\/span>/g,"$1"); // (*3)
});
.bg-red {
background-color: red;
}
<div id="block" contenteditable="true">
<div>this is testing this is testing this is testing</div>
<div>this is testing this is testing this is testing</div>
</div>
<button id="button">mark</button>