How I can set pointer to contenteditable div using JavaScript ?
Something like this: $('[contenteditable="true"]').setCursor(10);
Asked
Active
Viewed 114 times
0

Mykola Striletskyy
- 51
- 5
-
What do you mean with 'set pointer'? Give focus to the div? Move the mouse cursor to the div? Change the mouse cursor shape when hovering over the div? Please edit and improve your question. – Ruud Helderman Oct 01 '14 at 08:04
-
I think you may want this: http://stackoverflow.com/questions/16095155/javascript-contenteditable-set-cursor-caret-to-index – Tim Down Oct 01 '14 at 08:56
1 Answers
0
Here is the snippet that may help you. You can find working example here http://jsfiddle.net/naveen_champ/wps4cn01/
UPDATE: Code updated [on 02-Oct-2014] after Tim comments, to match support content editable elements.
!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 = document.body.createTextRange();
textRange.moveToElementText(containerEl);
textRange.collapse(true);
textRange.moveEnd("character", end);
textRange.moveStart("character", start);
textRange.select();
};
}
$.fn.setCaretPosition = function(caretPos) {
return this.each(function(){
var elem = this;
setSelectionByCharacterOffsets(elem, caretPos, caretPos);
});
}
}(window.jQuery);

Naveen I
- 5,695
- 2
- 15
- 8