мерзкое решение:
для ie: использовать document.selection ...
для ff: используйте pre за textarea, вставьте текст перед курсором в него, поместите HTML-элемент маркера после него (cursorPos) и получите позицию курсора через этот элемент маркера
Примечания: | код ужасен, извините за это | шрифт pre и textarea должен быть одинаковым | непрозрачность используется для визуализации | здесь нет автозаполнения, просто курсор, следующий за div (при вводе внутри textarea) (измените его в зависимости от ваших потребностей)
<code><html>
<style>
pre.studentCodeColor{
position:absolute;
margin:0;
padding:0;
border:1px solid blue;
z-index:2;
}
textarea.studentCode{
position:relative;
margin:0;
padding:0;
border:1px solid silver;
z-index:3;
overflow:visible;
opacity:0.5;
filter:alpha(opacity=50);
}
</style>
hello world<br/>
how are you<br/>
<pre class="studentCodeColor" id="preBehindMyTextarea">
автозаполнение содержимого
var myTextarea = document.getElementById ('myTextarea');
var preBehindMyTextarea = document.getElementById ('preBehindMyTextarea');
var autoCompleteSelector = document.getElementById ('autoCompleteSelector');
function ieTaKeyUp () {
var r = document.selection.createRange ();
autoCompleteSelector.style.top = r.offsetTop;
autoCompleteSelector.style.left = r.offsetLeft;
}
function taKeyUp () {
taSelectionStart = myTextarea.selectionStart;
preBehindMyTextarea.innerHTML = myTextarea.value.substr (0, taSelectionStart) + '
';
cp = document.getElementById ('cursorPos');
leftTop = findPos (cp);
autoCompleteSelector.style.top = leftTop [1];
autoCompleteSelector.style.left = leftTop [0];
}
function findPos (obj) {
var curleft = curtop = 0;
if (obj.offsetParent) {
делать {
curleft + = obj.offsetLeft;
curtop + = obj.offsetTop;
} while (obj = obj.offsetParent);
}
возврат [curleft, curtop];
}
//myTextarea.selectionStart