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 |
|
спасибо!
|