contenteditable insert and replace

by Stalk

HTML

<div contenteditable="true">
  <u>мама</u> <span><i>мыла</i> <b>раму</b></span>
</div>

<hr>

<button class="inserter">☺</button>
<button class="inserter">☻</button>

JavaScript

document.addEventListener('click', function (evt){
  let elem = evt.target
  if (elem.classList && elem.classList.contains('inserter')) {
    let newContent = document.createElement('span')
    newContent.textContent = elem.innerHTML

    replace(newContent)
  }
})

function replace(replacementNode){
  let range = window.getSelection().getRangeAt(0)
  if (!range.startContainer.parentElement.closest('[contenteditable]')) {
  	return false
  }
  
  range.deleteContents()
  range.insertNode(replacementNode)
  replacementNode.closest('[contenteditable]').focus()
  range.collapse()
}