This pen demonstrates the JavaScript functionality to retrieve and set the start and end range selection values for "input" / "textarea" fields.
A Pen by K.C.Ashish Kumar on CodePen.
<div><input class="getPos" /><input class="posStart" /><input class="posEnd" /><button>set cursor position</button></div> | |
<div><textarea class="getPos"></textarea><input class="posStart" /><input class="posEnd" /><button>set cursor position</button></div> | |
<!-- | |
© 2021 https://kcak11.com / https://ashishkumarkc.com | |
--> |
This pen demonstrates the JavaScript functionality to retrieve and set the start and end range selection values for "input" / "textarea" fields.
A Pen by K.C.Ashish Kumar on CodePen.
/* | |
© 2021 https://kcak11.com / https://ashishkumarkc.com | |
*/ | |
function getCursorPos(input) { | |
if ("selectionStart" in input && document.activeElement == input) { | |
return { | |
start: input.selectionStart, | |
end: input.selectionEnd | |
}; | |
} | |
else if (input.createTextRange) { | |
var sel = document.selection.createRange(); | |
if (sel.parentElement() === input) { | |
var rng = input.createTextRange(); | |
rng.moveToBookmark(sel.getBookmark()); | |
for (var len = 0; rng.compareEndPoints("EndToStart", rng) > 0; rng.moveEnd("character", -1)) { | |
len++; | |
} | |
rng.setEndPoint("StartToStart", input.createTextRange()); | |
for (var pos = { start: 0, end: len }; rng.compareEndPoints("EndToStart", rng) > 0; rng.moveEnd("character", -1)) { | |
pos.start++; | |
pos.end++; | |
} | |
return pos; | |
} | |
} | |
return -1; | |
} | |
function setCursorPos(input, start, end) { | |
if (arguments.length < 3) end = start; | |
if ("selectionStart" in input) { | |
setTimeout(function() { | |
input.selectionStart = start; | |
input.selectionEnd = end; | |
}, 1); | |
} | |
else if (input.createTextRange) { | |
var rng = input.createTextRange(); | |
rng.moveStart("character", start); | |
rng.collapse(); | |
rng.moveEnd("character", end - start); | |
rng.select(); | |
} | |
} | |
$(function() { | |
$(":input.getPos").on("keyup click", function(e) { | |
var pos = getCursorPos(this); | |
$(this).siblings(".posStart").val(pos.start); | |
$(this).siblings(".posEnd").val(pos.end); | |
}).siblings("input").keydown(function(e){ | |
if (e.keyCode == 13){ | |
$(this).siblings("button").click(); | |
e.preventDefault(); | |
} | |
}); | |
$("button").click(function(e) { | |
var par = $(this).parent(); | |
setCursorPos(par.find(":input.getPos")[0], +par.find(".posStart").val(), +par.find(".posEnd").val()); | |
par.find(":input.getPos")[0].focus(); | |
}); | |
}); | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> |
/* | |
© 2021 https://kcak11.com / https://ashishkumarkc.com | |
*/ | |
body, input, textarea { | |
font-family: sans-serif; | |
} | |
div { | |
margin-bottom: 10px; | |
} | |
.getPos ~ * { | |
margin-left: 5px; | |
} | |
.getPos, input { | |
width: 200px; | |
padding: 2px 3px; | |
border: 1px solid #ccc; | |
border-radius: 5px; | |
} | |
textarea { | |
height: 200px; | |
} | |
textarea ~ * { | |
vertical-align: top; | |
} | |
input { | |
width: 3em; | |
} |