JSFiddle - React, Tailwind, and code Playground
by Imri Paloja
HTML
<div contenteditable="true" class="textEditor">Some random text.</div>
<a href="#" class="embolden">Bold</a>
CSS
.bold {
font-weight: bold;
}
JavaScript
jQuery(function($) {
$('.embolden').click(function(){
var highlight = window.getSelection();
var span = '<span class="bold">' + highlight + '</span>';
var text = $('.textEditor').html();
// Return if no selection
var parent = getSelectionParentElement();
if($(parent).hasClass('bold')) {
$('.textEditor').html(text.replace(span, highlight));
} else {
$('.textEditor').html(text.replace(highlight, span));
}
});
});
function getSelectionParentElement() {
var parentEl = null, sel;
if (window.getSelection) {
sel = window.getSelection();
if (sel.rangeCount) {
parentEl = sel.getRangeAt(0).commonAncestorContainer;
if (parentEl.nodeType != 1) {
parentEl = parentEl.parentNode;
}
}
} else if ( (sel = document.selection) && sel.type != "Control") {
parentEl = sel.createRange().parentElement();
}
return parentEl;
}