Gozar
Немного не так.
Тут исходник, а
тут работает скрипт (правда регистрация нужна).
Для ie текст вставляетcя, а для не ie текст заменяется. И как верно замечено: textarea.setSelectionRange устанавливает карретку в нужную позицию.
Дело в том, что после вставки/замены текста, необходимо перевести фокус на textarea, что бы пользователь мог напечатать текст, под только что вставленным/замененным текстом, т.к. это скрипт быстрого цтеирования. И тут у меня беда:
1. Вставленный/замененный текст может "уйти" ниже текущей прокрутки textarea, т.е. окончание вставленного/замененного текста будет не виден. Вопрос, как высчитать на какое значение прокручивать textarea.scrollTop?
2. После вставки/замены текста, передается фокус textarea.focus(), но выполняется только прокрутка страницы до textarea, а карретка не активизируется (ie 6, opera 10, ff 3, может быть это только в моей системе.?). Например, здесь (на этом форуме), в редакции текста, после вставки смайлика, карретка сразуже "мигает" после вставленного смайла - как это организованно?
Участок кода, вставляющий текст:
// qq.CaretPos for Opera and FireFox
if (qq.TextArea.selectionStart+1 && qq.TextArea.selectionEnd+1) qq.CaretPos = qq.TextArea.selectionEnd;
var startText = qq.TextArea.value.substring(0, qq.CaretPos).replace(/^(\r*\n)*/g, '').replace(/^\s*/g, '');
var endText = qq.TextArea.value.substring(qq.CaretPos, qq.TextArea.value.length);
// код генерации текста для вставки
//var scrollTop = qq.TextArea.scrollTop;
//var scrollLeft = qq.TextArea.scrollLeft;
// insert text
if (qq.TextArea.caretPos) qq.TextArea.caretPos.text = text;
else if (qq.TextArea.selectionStart+1 && qq.TextArea.selectionEnd+1)
qq.TextArea.value = startText + text + endText;
else qq.TextArea.value += text;
// set caret in textarea
if (navigator.userAgent.toLowerCase().indexOf("gecko") != -1) qq.CaretPos--;
if (window.getSelection || document.getSelection) qq.TextArea.setSelectionRange(qq.CaretPos+text.length, qq.CaretPos+text.length);
//qq.TextArea.scrollTop = scrollTop;
//qq.TextArea.scrollLeft = scrollLeft;
// focus to textarea and qq.CaretPos for IE
if (focus) qq.TextArea.focus();
if (qq.TextArea.caretPos || document.selection) qq.CaretPos += text.length;
И для IE запоминание позиции вставки:
if (document.selection && document.selection.createRange){
var range = document.selection.createRange();
var dpl = range.duplicate();
dpl.moveToElementText(qq.TextArea);
dpl.setEndPoint("EndToEnd", range);
qq.CaretPos = dpl.text.length;
if (range.text.length == 0){
qq.TextArea.caretPos = document.selection.createRange().duplicate();
}else{
range = document.selection.createRange();
range.move('character', range.text.length);
qq.TextArea.caretPos = range.duplicate();
}
}