Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You could save and restore the character position using functions like these:</p> <p><a href="https://stackoverflow.com/a/13950376/96100">https://stackoverflow.com/a/13950376/96100</a></p> <p>I've adapted these function slightly to work for an element inside an iframe.</p> <p>Demo: <a href="http://jsfiddle.net/timdown/gEhjZ/4/" rel="nofollow noreferrer">http://jsfiddle.net/timdown/gEhjZ/4/</a></p> <p>Code:</p> <pre><code>var saveSelection, restoreSelection; if (window.getSelection &amp;&amp; document.createRange) { saveSelection = function(containerEl) { var doc = containerEl.ownerDocument, win = doc.defaultView; var range = win.getSelection().getRangeAt(0); var preSelectionRange = range.cloneRange(); preSelectionRange.selectNodeContents(containerEl); preSelectionRange.setEnd(range.startContainer, range.startOffset); var start = preSelectionRange.toString().length; return { start: start, end: start + range.toString().length }; }; restoreSelection = function(containerEl, savedSel) { var doc = containerEl.ownerDocument, win = doc.defaultView; var charIndex = 0, range = doc.createRange(); range.setStart(containerEl, 0); range.collapse(true); var nodeStack = [containerEl], node, foundStart = false, stop = false; while (!stop &amp;&amp; (node = nodeStack.pop())) { if (node.nodeType == 3) { var nextCharIndex = charIndex + node.length; if (!foundStart &amp;&amp; savedSel.start &gt;= charIndex &amp;&amp; savedSel.start &lt;= nextCharIndex) { range.setStart(node, savedSel.start - charIndex); foundStart = true; } if (foundStart &amp;&amp; savedSel.end &gt;= charIndex &amp;&amp; savedSel.end &lt;= nextCharIndex) { range.setEnd(node, savedSel.end - charIndex); stop = true; } charIndex = nextCharIndex; } else { var i = node.childNodes.length; while (i--) { nodeStack.push(node.childNodes[i]); } } } var sel = win.getSelection(); sel.removeAllRanges(); sel.addRange(range); }; } else if (document.selection) { saveSelection = function(containerEl) { var doc = containerEl.ownerDocument, win = doc.defaultView || doc.parentWindow; var selectedTextRange = doc.selection.createRange(); var preSelectionTextRange = doc.body.createTextRange(); preSelectionTextRange.moveToElementText(containerEl); preSelectionTextRange.setEndPoint("EndToStart", selectedTextRange); var start = preSelectionTextRange.text.length; return { start: start, end: start + selectedTextRange.text.length }; }; restoreSelection = function(containerEl, savedSel) { var doc = containerEl.ownerDocument, win = doc.defaultView || doc.parentWindow; var textRange = doc.body.createTextRange(); textRange.moveToElementText(containerEl); textRange.collapse(true); textRange.moveEnd("character", savedSel.end); textRange.moveStart("character", savedSel.start); textRange.select(); }; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload