Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. <div contenteditable>012345<br><br><br>9012345</div>
  2.  
  3. function getCaret(el) {
  4. let start, end;
  5. const range = document.getSelection().getRangeAt(0),
  6. preSelectionRange = range.cloneRange(),
  7. postSelectionRange = range.cloneRange();
  8. preSelectionRange.selectNodeContents(el);
  9. preSelectionRange.setEnd(range.startContainer, range.startOffset);
  10. postSelectionRange.selectNodeContents(el);
  11. postSelectionRange.setEnd(range.endContainer, range.endOffset);
  12. start = preSelectionRange.toString().length;
  13. end = start + range.toString().length;
  14. // count <br>'s and adjust start & end
  15. if (start > 0) {
  16. var node,
  17. i = el.children.length;
  18. while (i--) {
  19. node = el.children[i];
  20. if (node.nodeType === 1 && node.nodeName === 'BR') {
  21. start += preSelectionRange.intersectsNode(el.children[i]) ? 1 : 0;
  22. end += postSelectionRange.intersectsNode(el.children[i]) ? 1 : 0;
  23. }
  24. }
  25. }
  26. return {start, end};
  27. }
  28.  
  29. function setCaret(el, start, end) {
  30. var node, i, nextCharIndex, sel,
  31. charIndex = 0,
  32. nodeStack = [el],
  33. foundStart = false,
  34. stop = false,
  35. range = document.createRange();
  36. range.setStart(el, 0);
  37. range.collapse(true);
  38. while (!stop && (node = nodeStack.pop())) {
  39. // BR's aren't counted, so we need to increase the index when one
  40. // is encountered
  41. if (node.nodeType === 1 && node.nodeName === 'BR') {
  42. charIndex++;
  43. } else if (node.nodeType === 3) {
  44. nextCharIndex = charIndex + node.length;
  45. if (!foundStart && start >= charIndex && start <= nextCharIndex) {
  46. range.setStart(node, start - charIndex);
  47. foundStart = true;
  48. }
  49. if (foundStart && end >= charIndex && end <= nextCharIndex) {
  50. range.setEnd(node, end - charIndex);
  51. stop = true;
  52. }
  53. charIndex = nextCharIndex;
  54. } else {
  55. i = node.childNodes.length;
  56. while (i--) {
  57. nodeStack.push(node.childNodes[i]);
  58. }
  59. }
  60. }
  61. sel = document.getSelection();
  62. sel.removeAllRanges();
  63. sel.addRange(range);
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement