Eu tenho um botão de marca na interface do usuário, clicando no qual qualquer seleção de usuário é marcada em vermelho. Sem problemas aqui. Eu alcanço issodocument.execCommand("insertHTML")
Mas tenho um requisito adicional de que, se a nova seleção for criada, que é a interseção das marcações antigas, a marcação vermelha da antiga seleção deve desaparecer.
Como um exemplo:
Na imagem a seguir: this e testing estão marcados. Agora, se eu selecionar o teste dele desde o início e a marca de clique, as marcações antigas disso e teste devem desaparecer e apenas o teste deve ser marcado porque há um cruzamento.
código:
const button = document.getElementById("button");
button.addEventListener('click', ()=>{
const s = window.getSelection();
const selectionStr = s.toString();
document.execCommand("insertHTML", false, `<span class="bg-red">${selectionStr}<span>`);
})
.bg-red {
background: red;
}
<div contenteditable="true">
this is testing this is testing this is testing
</div>
<button id="button">mark</button>
fonte