Cursor position in a textarea (character index, not x/y coordinates) Cursor position in a textarea (character index, not x/y coordinates) jquery jquery

Cursor position in a textarea (character index, not x/y coordinates)


Modified BojanG's solution to work with jQuery. Tested in Chrome, FF, and IE.

(function ($, undefined) {    $.fn.getCursorPosition = function() {        var el = $(this).get(0);        var pos = 0;        if('selectionStart' in el) {            pos = el.selectionStart;        } else if('selection' in document) {            el.focus();            var Sel = document.selection.createRange();            var SelLength = document.selection.createRange().text.length;            Sel.moveStart('character', -el.value.length);            pos = Sel.text.length - SelLength;        }        return pos;    }})(jQuery);

Basically, to use it on a text box, do the following:

$("#myTextBoxSelector").getCursorPosition();


function caretPos(el){    var pos = 0;    // IE Support    if (document.selection)     {        el.focus ();        var Sel = document.selection.createRange();        var SelLength = document.selection.createRange().text.length;        Sel.moveStart ('character', -el.value.length);        pos = Sel.text.length - SelLength;    }    // Firefox support    else if (el.selectionStart || el.selectionStart == '0')        pos = el.selectionStart;    return pos;}


I have done some work using this jQuery masked input plug and found the caret function really useful. I've pulled this code from the above plugin..

$.fn.caret = function (begin, end)    {        if (this.length == 0) return;        if (typeof begin == 'number')        {            end = (typeof end == 'number') ? end : begin;            return this.each(function ()            {                if (this.setSelectionRange)                {                    this.setSelectionRange(begin, end);                } else if (this.createTextRange)                {                    var range = this.createTextRange();                    range.collapse(true);                    range.moveEnd('character', end);                    range.moveStart('character', begin);                    try { range.select(); } catch (ex) { }                }            });        } else        {            if (this[0].setSelectionRange)            {                begin = this[0].selectionStart;                end = this[0].selectionEnd;            } else if (document.selection && document.selection.createRange)            {                var range = document.selection.createRange();                begin = 0 - range.duplicate().moveStart('character', -100000);                end = begin + range.text.length;            }            return { begin: begin, end: end };        }    }

Once you've created the function you can do operations like the following. Once again, this function was pulled from the jQuery masked input function mentioned above.

$("#id").caret(); //get the begin/end caret position$("#id").caret().begin;$("#id").caret().end;$("#otherId").caret(5); //set the caret position by index$("#otherId").caret(1, 5); //select a range