Далее привожу исходный текст функции vsk_frm_cursor_offset библиотеки vegUI и пояснения почему она не работала у меня.
/*****************************************************************************/
/** Function: vsk_frm_cursor_offset
* Returns the (pixels) position of the caret in an input style element
*
* Parameters:
*
* Node input - input or textarea node
*
* Returns:
*
* Object - containing x and y for the caret position
*
* (start code)
* { x : n, y : n }
* (end)
*/
function vsk_frm_cursor_offset(input) {
if (document.selection) {
var r = document.selection.createRange();
var i;
if(input.nodeName == 'TEXTAREA') {
var x = r.offsetLeft - r.boundingLeft;
var y = r.offsetTop - r.boundingTop;
} else {
var x = r.offsetLeft;
var y = r.offsetTop;
}
return {
x : x,
y : y
};
} else if(typeof input.setSelectionRange != 'undefined') {
var n = document.createElement('div'), i;
n.style.wrap = 'hard';
n.style.whiteSpace = 'pre';
n.style.position = 'absolute';
n.style.zIndex = -10;
if(input.parentNode.position != 'absolute' && input.parentNode.position!='relative')
input.parentNode.position = 'relative';
// !!! Здесь временный элемент div вставляется в родительский элемент текcтового поля, если это - ячейка таблицы
// разметка будет "прыгать" при выполнении этой функции, лучше добавлять к body
input.parentNode.appendChild(n);
// !!! Копирование стилей не работает в Fire Fox, т.к.
// в цикле переменная i представляет из себя не имя стиля а его индекс, т.к. s - массив а не объект,
// а конструкция for in применяется к объектам JavaScript
var s = document.defaultView.getComputedStyle(input,null);
for(i in s) {
if(
i.indexOf('font')>-1 ||
i.indexOf('padding')>-1
) {
n.style[i] = s[i];
}
}
n.style.width = input.offsetWidth+'px';
n.style.height = input.offsetHeight+'px';
n.style.left = input.offsetLeft+'px';
n.style.top = input.offsetTop+'px';
n.style.overflow = 'auto';
n.innerHTML = input.value.replace(
new RegExp("(.{1,"+(input.cols+1)+"})",'g'),"$1\n"
);
n.scrollLeft = input.scrollLeft;
n.scrollTop = input.scrollTop;
var r = document.createRange();
var e = document.createElement('span');
r.setStart(n.firstChild, input.selectionStart);
r.setEnd(n.firstChild, input.selectionStart);
r.surroundContents(e);
var obj = {
x : e.offsetLeft - n.scrollLeft,
y : e.offsetTop - n.scrollTop
};
n.parentNode.removeChild(n);
return obj;
}
}
Кроме проблем указанных в комментариях этот код не учитывает возможности смещение текста для элемента input, если пользователь прокрутил содержимое текстового поля, т.к. scrollLeft для input равен 0 в Fire Fox.