Cursor Position For Content Editable

by naveen_champ

HTML

<div id="testDiv" contenteditable="true">hi this is test div with content editable as true. To test set cursor position</div>
<center><button id="testBtn"> Click here to set cursur position at 10</button></center>

CSS

#testDiv{
    margin:40px 10px;
    padding:10px;
    border:1px solid #333;
    color:#444;
    font:16px normal Arial;
}

#testBtn{
    margin:10px;
    display:block;
    padding:10px 14px;
    text-align:center;
    width:90%;
}

JavaScript

!function($){   
	function findHiddenCharacters(node, beforeCaretIndex) {
		var hiddenCharacters = 0
		var lastCharWasWhiteSpace=true
		for(var n=0; n-hiddenCharacters<beforeCaretIndex &&n<node.length; n++) {
			if([' ','\n','\t','\r'].indexOf(node.textContent[n]) !== -1) {
				if(lastCharWasWhiteSpace)
					hiddenCharacters++
				else
					lastCharWasWhiteSpace = true
			} else {
				lastCharWasWhiteSpace = false   
			}
		}

		return hiddenCharacters
	}
	var setSelectionByCharacterOffsets = null;

	if (window.getSelection && document.createRange) {
		setSelectionByCharacterOffsets = function(containerEl, start, end) {
			var charIndex = 0, range = document.createRange();
			range.setStart(containerEl, 0);
			range.collapse(true);
			var nodeStack = [containerEl], node, foundStart = false, stop = false;

			while (!stop && (node = nodeStack.pop())) {
				if (node.nodeType == 3) {
					var hiddenCharacters = findHiddenCharacters(node, node.length)
					var nextCharIndex = charIndex + node.length - hiddenCharacters;

					if (!foundStart && start >= charIndex && start <= nextCharIndex) {
						var nodeIndex = start-charIndex
						var hiddenCharactersBeforeStart = findHiddenCharacters(node, nodeIndex)
						range.setStart(node, nodeIndex + hiddenCharactersBeforeStart);
						foundStart = true;
					}
					if (foundStart && end >= charIndex && end <= nextCharIndex) {
						var nodeIndex = end-charIndex
						var hiddenCharactersBeforeEnd = findHiddenCharacters(node, nodeIndex)
						range.setEnd(node, nodeIndex + hiddenCharactersBeforeEnd);
						stop = true;
					}
					charIndex = nextCharIndex;
				} else {
					var i = node.childNodes.length;
					while (i--) {
						nodeStack.push(node.childNodes[i]);
					}
				}
			}

			var sel = window.getSelection();
			sel.removeAllRanges();
			sel.addRange(range);
		}
	} else if (document.selection) {
		setSelectionByCharacterOffsets = function(containerEl, start, end) {
			var textRange =...