ВНИМАНИЕ! ОСТЕРЕГАЙТЕСЬ МОШЕННИКОВ!
Помните, что все браузеры Opera АБСОЛЮТНО БЕСПЛАТНЫ.
Загружайте новые версии ТОЛЬКО С ОФИЦИАЛЬНОГО САЙТА или с ресурсов, которым ДОВЕРЯЕТЕ!


Предыдущее | Следующее | Архив форума | myOpera.net | Поиск
JavaScript GZep  03/15/07 04:11 PM

Здравствуйте!

Вот уже какой месяц меня мучает проблема с JavaScript в Opera.

Суть проблемы: многие знают, что opera начала поддерживать document.selection только с 8-ой версии, что не есть хорошо...

Но вот проблема, мне неохдимо сделать форму встевки тегов такой схемы:
В начале
Code:

Текст_Текст_Текст_Текст_ВЫДЕЛЕННЫЙ_ТЕКСТ_Текст_Текст_Текст_Текст_КУРСОР


Дальше активируем кнопку вставки тега
Code:

Текст_Текст_Текст_Текст_[ТЕГ]_ВЫДЕЛЕННЫЙ_ТЕКСТ_[/ТЕГ]_Текст_Текст_Текст_Текст_КУРСОР


Только мне никак не удается переместить курсор в конец всей формы ввода, ибо она находится вне области выделения. Расширить область выделения у меня не получается.

Пожалуйста, помогите! Бьюсь над этим уже очень давно, и очень сделать хотелось бы.

С Другими браузерами все прекрасно работает, так как с селекцией у них все более-менее в порядке.

Вот код, он расчитан только на оперу, так как для остального можно будет просто позже вставить...чтобы не отвлекало...
Code:

<script language="JavaScript" type="text/javascript">
<!--
function tagHandler(id) {
this.target = document.getElementById(id);
this.target.parent = this;
this.target.onChange = positionSaver;
this.target.onclick = positionSaver;
this.target.onkeyup = positionSaver;
this.target.onfocus = positionSaver;
}
tagHandler.prototype.insert = function(open, close) {
if (typeof(this.cursor) != "undefined") {//Opera 8.0
if (this.cursor.text.length) {//Если имеется выделение - НЕ РАБОТАЕТ
this.cursor.text = open + this.cursor.text + close;//Обводим выделенное тегами
//Здесь надо поставить курсор в самый конец всей textarea
} else {//Если имеется курсор без выделенного участка строки - ВСЕ РАБОТАЕТ
this.cursor.text = open + close;//Вставляем теги на место курсора
this.cursor.moveEnd("character", -close.length);//Ставим курсор между тегами
}
this.cursor.select();//Переносим селекцию
return;//Завершаем работу функции.
}
}
function positionSaver() {
if (document.selection && document.selection.createRange)//Opera 8.0
this.parent.cursor = document.selection.createRange().duplicate();
}
/* * * * * * * * * * * * * * * * * * * */
onload = function() {
tag = new tagHandler("area");
}
// -->
</script>
<form>
<textarea id="area" cols="100" rows="20"></textarea>
</form>
<a href="javascript:tag.insert('[b]', '[/b]');">[b]</a> <a href="javascript:tag.insert('[i]', '[/i]');">[i]</a>


Заранее благодарен, GZep.

Re: JavaScript Lex1  03/18/07 12:17 PM

В ответ на:
Только мне никак не удается переместить курсор в конец всей формы ввода

При наличии выделения? Не уверен что правильно понял, но достаточно его снять и можно ставить курсор куда угодно.

Вот простенький букмарклет:
Code:
javascript:(function(){var ta = 

window.document.getElementsByTagName('textarea'); var tl=ta.length-1; if(tl<0){return}; do{var t=ta[tl]; tl--}
while(tl>-1&&t.rows<5);var s=document.selection.createRange();var st='[tag]'+s.text+'[/
tag]';s.text=st;t.setSelectionRange(t.value.length, t.value.length);t.focus();})()



Re: JavaScript GZep  03/21/07 11:00 AM

А вы немогли бы код попонятнее и с комментариями написать? а-то просто не могу разобрать что к чему...

Re: JavaScript Lex1  03/21/07 01:09 PM

Да что там комментировать Сначала ищем textarea (на странице это естественно не нужно), потом выполняем «var s=document.selection.createRange();»(аналогично IE) и добавляем теги к тексту.
Дальше устанавливаем курсор в конец textarea «t.setSelectionRange(t.value.length, t.value.length)»(это уже из _//developer.mozilla.org/en/docs/XUL:Method:setSelectionRange_ ) и передаём фокус.

Re: JavaScript GZep  03/21/07 08:02 PM

Как оказалось - все гораздо проще. Даже не надо было цикл использовать, что уже радует
Вот заветная строчка:
Code:

this.cursor.move("textedit", 1);//Ставим курсор в конец


Итого весь код:
Code:

<script language="JavaScript" type="text/javascript">
<!--
function tagHandler(id) {
this.target = document.getElementById(id);
this.target.parent = this;
this.target.onChange = positionSaver;
this.target.onclick = positionSaver;
this.target.onkeyup = positionSaver;
this.target.onfocus = positionSaver;
}
tagHandler.prototype.insert = function(open, close) {
if (typeof(this.cursor) != "undefined") {//Opera 8.0
if (this.cursor.text.length) {//Если имеется выделение - НЕ РАБОТАЕТ
this.cursor.text = open + this.cursor.text + close;//Обводим выделенное тегами
this.cursor.move("textedit", 1);//Ставим курсор в конец
} else {//Если имеется курсор без выделенного участка строки - ВСЕ РАБОТАЕТ
this.cursor.text = open + close;//Вставляем теги на место курсора
this.cursor.moveEnd("character", -close.length);//Ставим курсор между тегами
}
this.cursor.select();//Переносим селекцию
return;//Завершаем работу функции.
}
}
function positionSaver() {
if (document.selection && document.selection.createRange)//Opera 8.0
this.parent.cursor = document.selection.createRange().duplicate();
}
/* * * * * * * * * * * * * * * * * * * */
onload = function() {
tag = new tagHandler("area");
}
// -->
</script>
<form>
<textarea id="area" cols="100" rows="20"></textarea>
</form>
<a href="javascript:tag.insert('[b]', '[/b]');">[b]</a> <a href="javascript:tag.insert('[i]', '[/i]');">[i]</a>



Lex1, немогли бы вы объяснить, почему эта строчка привела код в норму?.. Дело в том, что это немножко нелогично, на сколько я понял. Решение, конечно, весьма оптимальное и быстрое, но мне кажется, что в нем используется баг браузера, что не есть хорошо.

Re: JavaScript Lex1  03/22/07 02:01 PM

В ответ на:
почему эта строчка привела код в норму?

Только в Opera 9. В Opera 8, курсор сдвигается влево на один символ.
Такой вариант работает в обеих
Code:
tagHandler.prototype.insert = function(open, close) {
if (typeof(this.cursor) != "undefined") {//Opera 8.0
if (this.cursor.text.length) {//Если имеется выделение - НЕ РАБОТАЕТ
this.cursor.text = open + this.cursor.text + close;//Обводим выделенное тегами
// this.cursor.move("textedit", 1);//Ставим курсор в конец
var t=document.getElementById("area");
t.setSelectionRange(t.value.length, t.value.length);
t.focus(); //Переносим фокус
} else {//Если имеется курсор без выделенного участка строки - ВСЕ РАБОТАЕТ
this.cursor.text = open + close;//Вставляем теги на место курсора
this.cursor.moveEnd("character", -close.length);//Ставим курсор между тегами
this.cursor.select();//Переносим селекцию
}

return;//Завершаем работу функции.
}
}



Re: JavaScript GZep  03/22/07 06:33 PM

Lex1, спасибо огромнейшее!!!

Значит, в опере все работает, если использовать setSelectionRange

А вот в ИЕ используется moveToElementText в связке с collapse.

Lex1, еще 3 вопросика:
1 - Почему пишут, что в опере возникают проблемы при .focus()
(тоесть приходится if (!window.opera) this.target.focus();)
2 - Коллапсировка, как в ИЕ не нужна?
3 - Так почему же тот скрипт работал в 9-ой версии? Это глюк?

Re: JavaScript GZep  03/22/07 06:38 PM

Lex1, странно, но ваш пример не ставит курсор в самый конец textarea, а ставит лишь в конец выделения...

Не знаю, как в 8-ой версии, но в 9-ой это так.

Re: JavaScript GZep  03/22/07 06:55 PM

Протестировал на 8-ой (8.54 portable) - не работает ни один из вариантов...

Re: JavaScript Lex1  03/23/07 03:29 PM

У _//lexi.ucoz.ru/tst.htm_и в Opera8 и в Opera9, он работает правильно.

Re: JavaScript GZep  03/31/07 06:48 PM

Уважаемый Lex1, ответте, пожалуйста на вопрос в конце этого сообщения...
Code:

function tagHandler(id) {
this.target = document.getElementById(id);
this.target.parent = this;
this.target.onChange = positionSaver;
this.target.onclick = positionSaver;
this.target.onkeyup = positionSaver;
this.target.onfocus = positionSaver;
}
tagHandler.prototype.insert = function(open, close) {
if (typeof(this.cursor) != "undefined") {//Opera 8.0
if (this.cursor.text.length) {//Если имеется выделение - НЕ РАБОТАЕТ
this.cursor.text = open + this.cursor.text + close;//Обводим выделенное тегами
// this.cursor.move("textedit", 1);//Ставим курсор в конец
var t=document.getElementById("area");
t.setSelectionRange(t.value.length, t.value.length);
t.focus(); //Переносим фокус
} else {//Если имеется курсор без выделенного участка строки - ВСЕ РАБОТАЕТ
this.cursor.text = open + close;//Вставляем теги на место курсора
this.cursor.moveEnd("character", -close.length);//Ставим курсор между тегами
this.cursor.select();//Переносим селекцию
}

return;//Завершаем работу функции.
}
}



Спасибо, работает. Вот только не могу понять, почему нельзя вместо:
Code:

var t=document.getElementById("area");
t.setSelectionRange(t.value.length, t.value.length);
t.focus(); //Переносим фокус


использовать
Code:

this.target;
//он уже был предопределен в самом начале скрипта:
//this.target = document.getElementById(id);//этой строчкой



Ответте, пожалуйста.

Re: JavaScript Lex1  04/01/07 05:06 PM

В ответ на:
почему нельзя вместо

Можно. Я просто не слишком внимательно смотрел код .

В ответ на:
1 - Почему пишут, что в опере возникают проблемы при

Не замечал.
В ответ на:
2 - Коллапсировка, как в ИЕ не нужна?

Т.к. мы используем мозилловские функции, то это не нужно.

Re: JavaScript Alex_B  04/24/07 02:52 PM

Здравствуйте, не смог разобюраться.
Но вопрос мой очень похож.

я перехватываю ввод символа в поле ввода(событие onkeypress)

и ввожу в поле ввода свой символ:
Code:
 
input.value += 'a';
return false;



input - ссылка на поле ввода.

В FF и IE, курсор остается в конце, как и при обычном вводе. Т.е. от всегда остается в конце строки
В Opera курсор ставится в начало. Получается что символ добавляется не в конец(как надо), а в начало строки. Как с этим бороться.

Спасибо.

Re: JavaScript Lex1  04/28/07 08:47 PM

Если не ошибаюсь, то в Opera позиция курсора при изменении свойства value не меняется. Её нужно устанавливать самостоятельно.
Code:
input.setSelectionRange(input.value.length, input.value.length)



Re: JavaScript Alex_B  05/02/07 01:55 PM

спасибо!


MyOpera.net - Home


Rambler's Top100