JSFiddle - React, Tailwind, and code Playground

HTML

<div id="selectable">
  <p>Hello world, <b>Attack on Titan</b> season two!</p>
  <p>Another paragraph with sample text.</p>
</div>
<div id="notSelectable">
  <p>The selection will behave normally on this div.</p>
</div>

JavaScript

(function(el){
  // variable declaration for previous range info
  // and function for finding the sibling
	var prevRangeInfo = {},
    findSibling = function(thisNode, direction){
      // get the child node list of the parent node
      var childNodeList = thisNode.parentNode.childNodes,
        children = [];
                
        // convert the child node list to an array
        for(var i=0, l=childNodeList.length; i<l; i++) children.push(childNodeList[i]);
        
        return children[children.indexOf(thisNode) + direction];
    };
  
	el.addEventListener('mouseup',function(evt){
		if (document.createRange) { // Works on all browsers, including IE 9+
    	
			var selected = window.getSelection();
      // Removing the following line from comments will make the function drag-only
			/* if(selected.toString().length){ */
				var	d = document,
					nA = selected.anchorNode,
					oA = selected.anchorOffset,
					nF = selected.focusNode,
					oF = selected.focusOffset,
					range = d.createRange(),
          rangeLength = 0;
        
				range.setStart(nA,oA);
				range.setEnd(nF,oF);
				
				// Check if direction of selection is right to left
				if(range.startContainer !== nA || (nA === nF && oF < oA)){
					range.setStart(nF,oF);
					range.setEnd(nA,oA);
				}
				
				// Extend range to the next space or end of node
				while(range.endOffset < range.endContainer.textContent.length && !/\s$/.test(range.toString())){
					range.setEnd(range.endContainer, range.endOffset + 1);
				}
				// Extend range to the previous space or start of node
				while(range.startOffset > 0 && !/^\s/.test(range.toString())){
					range.setStart(range.startContainer, range.startOffset - 1);
				}
				
				// Remove spaces
				if(/\s$/.test(range.toString()) && range.endOffset > 0)
					range.setEnd(range.endContainer, range.endOffset - 1);
				if(/^\s/.test(range.toString()))
					range.setStart(range.startContainer, range.startOffset + 1);
				
        // Store the...