JSFiddle - React, Tailwind, and code Playground
HTML
<textarea id="input"></textarea>
<input type="button" value="button" onclick="storeSelection();" />
<div></div>
JavaScript
function storeSelection() {
var el = $("#input")[0];
var sel = GetRangeSelection(el);
alert("check" + sel.start + ", " + sel.end);
}
function alerta(msg) {
$('div').append("<br /><br />"+msg);
}
function GetRangeSelection(el) {
var start = 0, end = 0, selectedText = '', normalizedValue, range,
textInputRange, len, endRange;
if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
start = el.selectionStart;
end = el.selectionEnd;
} else {
el.focus();
range = document.selection.createRange();
if (range && range.parentElement() == el) {
len = el.value.length;
normalizedValue = el.value.replace(/\r\n/g, "\n");
alerta('bk:' + range.getBookmark());
// Create a working TextRange that lives only in the input
textInputRange = el.createTextRange();
textInputRange.moveToBookmark(range.getBookmark());
// Check if the start and end of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = el.createTextRange();
endRange.collapse(false);
alerta('rng s:'+textInputRange.compareEndPoints("StartToEnd", endRange));
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
alerta('1');
start = end = len;
} else {
alerta('2');
start = -textInputRange.moveStart("character", -len);
alerta('st:' + start);
start += normalizedValue.slice(0, start).split("\n").length - 1;
alerta('rng e:' + textInputRange.compareEndPoints("EndToEnd", endRange));
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
alerta('3');
end = len;
} else {
...