Path: blob/master/emojionearea/src/block/selection.js
576 views
define([], function() {1var saveSelection, restoreSelection;2if (window.getSelection && document.createRange) {3saveSelection = function(el) {4var sel = window.getSelection && window.getSelection();5if (sel && sel.rangeCount > 0) {6var range = sel.getRangeAt(0);7var preSelectionRange = range.cloneRange();8preSelectionRange.selectNodeContents(el);9preSelectionRange.setEnd(range.startContainer, range.startOffset);10return preSelectionRange.toString().length;11}12};1314restoreSelection = function(el, sel) {15var charIndex = 0, range = document.createRange();16range.setStart(el, 0);17range.collapse(true);18var nodeStack = [el], node, foundStart = false, stop = false;1920while (!stop && (node = nodeStack.pop())) {21if (node.nodeType == 3) {22var nextCharIndex = charIndex + node.length;23if (!foundStart && sel >= charIndex && sel <= nextCharIndex) {24range.setStart(node, sel - charIndex);25range.setEnd(node, sel - charIndex);26stop = true;27}28charIndex = nextCharIndex;29} else {30var i = node.childNodes.length;31while (i--) {32nodeStack.push(node.childNodes[i]);33}34}35}3637sel = window.getSelection();38sel.removeAllRanges();39sel.addRange(range);40}41} else if (document.selection && document.body.createTextRange) {42saveSelection = function(el) {43var selectedTextRange = document.selection.createRange(),44preSelectionTextRange = document.body.createTextRange();45preSelectionTextRange.moveToElementText(el);46preSelectionTextRange.setEndPoint("EndToStart", selectedTextRange);47var start = preSelectionTextRange.text.length;48return start + selectedTextRange.text.length;49};5051restoreSelection = function(el, sel) {52var textRange = document.body.createTextRange();53textRange.moveToElementText(el);54textRange.collapse(true);55textRange.moveEnd("character", sel);56textRange.moveStart("character", sel);57textRange.select();58};59}60});6162