Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.11.2009, 00:43
Кандидат Javascript-наук
Отправить личное сообщение для `p r o x y Посмотреть профиль Найти все сообщения от `p r o x y
 
Регистрация: 04.05.2009
Сообщений: 105

scrollTop до позиции корретки в textareay и textarea.focus
Время доброго.

1) Подскажите, пожалуйста, если известна позиция корретки в textarea, как вычислить на какую высоту прокрутить скролл textarea. После вставки текста под курсор, необходимо прокрутить textarea до окончания вставленного текста.

Вставка для ie:
textarea.caretPos.text = newtext; 
(textarea.caretPos = document.selection.createRange().duplicate();)


Вставка для opera/ff:
textarea.value = textarea.value.substring(0, textarea.selectionEnd) + newtext + textarea.value.substring(textarea.selectionEnd, textarea.value.length)


2) textarea.focus(); – переводит фокус на textarea, но корретка не активизируется, т.е. только пролистывается страница до textarea, а что бы начать ввод, все равно, приходится кликать мышкой в textarea (ie6, opera 10, ff 3).

Есть варианты как с этим справится?
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2009, 08:50
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Если я не прав поправьте меня:
После вставки текста под курсор

это как?
В тексте курсор может только определять позицию точки вставки и вставить под него ничего нельзя.

textarea.value = ...
не вставляет текст в textarea, а заменяет значение value

для FF
textarea.setSelectionRange(start,end);
используйте оба аргумента одинаковыми для того, чтобы переместить курсор в соответствующую позицию без выделения текста (мой перевод с MDC)

для IE найдете сами: moveStart, moveEnd

Последний раз редактировалось Gozar, 04.11.2009 в 09:21.
Ответить с цитированием
  #3 (permalink)  
Старый 04.11.2009, 11:18
Кандидат Javascript-наук
Отправить личное сообщение для `p r o x y Посмотреть профиль Найти все сообщения от `p r o x y
 
Регистрация: 04.05.2009
Сообщений: 105

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();
	}
}

Последний раз редактировалось `p r o x y, 04.11.2009 в 11:21.
Ответить с цитированием
  #4 (permalink)  
Старый 04.11.2009, 12:13
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Цитата:
После вставки/замены текста, передается фокус textarea.focus(), но выполняется только прокрутка страницы до textarea, а карретка не активизируется (ie 6, opera 10, ff 3, может быть это только в моей системе.?).
Цитата:
textarea.setSelectionRange устанавливает карретку в нужную позицию.
textarea.focus()
textarea.setSelectionRange(0,0)

устанавливает каретку с МИГАЮЩИМ курсором в начало textarea
и в Оpera и в FF замечательно работает и мигает

Последний раз редактировалось Gozar, 04.11.2009 в 12:16.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск