Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как вставить текст в место расположения курсора в поле ввода.
 
 автор: chelovek   (25.09.2006 в 17:59)   письмо автору
 
 

Объясните пожалуйста парумоментов в скрипте из примера по адресу:
http://javascript.aho.ru/subs/subs013.shtml
Мне из него нужны 2 кнопки: Pic-smile и URL.
Во первых для чего нужен следующий код:


if(d.body.createTextRange){setTimeout( //IE
"var t=insField.createTextRange();t.collapse();t.moveEnd('"
  +ch+"',"+insCursor+");t.moveStart('"+ch+"',"+insCursorL
  +");t.select();",1);  //задержка нужна
}else{  if(d.all)insField.focus(); //FF,Opera
  if(insField.selectionEnd!=null){
    insField.selectionStart=insCursorL;
    insField.selectionEnd=insCursor
      +(d.all?1:0) /*обход багов*/;
    setTimeout("insField.focus();",111);
  if(d.all){var tR=d.selection.createRange();
    if(insCursorL==insCursor)tR.collapse();
    else tR.moveEnd('character',-1);tR.select();}
}}}   //Функции-оболочки


У меня и без него работает... Может я что-то упустил???

Кстати, там где стоят комментарии /*обход багов*/; - какие баги имелись ввиду?


Во вторых можно немножко поподробнее что делают функции document.selection.createRange(); и document.body.createTextRange();
Я в одной книжке нашел, но там почти никак они не описаны - говорится чтото вроди того, что document.selection.createRange(); делает ссылку на текст, как то так...


Спасибо всем большое...

   
 
 автор: 12345   (25.09.2006 в 18:08)   письмо автору
 
   для: chelovek   (25.09.2006 в 17:59)
 

Это мой код и мои комментарии. Баги были в том, что в Опере курсор попадал не туда, а на соседнюю позицию, поэтому для неё +1.

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

Про объект TextRange - http://javascript.aho.ru/files/js/TextRange.html

Часть кнопок и функций, конечно, можете выбросить, смотря по тому, что в результате нужно.

   
 
 автор: chelovek   (25.09.2006 в 18:35)   письмо автору
 
   для: 12345   (25.09.2006 в 18:08)
 

Все равно немножко я не понял, а зачем тогда функция SetTimeout нужна?

   
 
 автор: 12345   (25.09.2006 в 18:55)   письмо автору
 
   для: chelovek   (25.09.2006 в 18:35)
 

Тоже обход багов. Без неё не устанавливается курсор в поле вообще. В статье об этом упомянуто. Насколько помню, только FF мог без setTimeout установить курсор.

   
 
 автор: chelovek   (26.09.2006 в 12:10)   письмо автору
 
   для: 12345   (25.09.2006 в 18:55)
 

У меня возник еще один вопрос по этому поводу:
С кодом я разобрался, все ненужное убрал, но возникла такая проблема: Если на страничку поместить буттон, который вставляет, например SMILE, то работает не верно - вставка происходит не в позицию курсора, а в конец всего текста. Это, как я понял происходит из за условия:

if(tR.parentElement && tR.parentElement() != TextareaObject){
...
}


А вот как его провильно исправить не могу сообразить... Подскажите пожалуйста...

   
 
 автор: chelovek   (27.09.2006 в 06:56)   письмо автору
 
   для: chelovek   (26.09.2006 в 12:10)
 

up

   
 
 автор: 12345   (27.09.2006 в 11:44)   письмо автору
 
   для: chelovek   (27.09.2006 в 06:56)
 

Покажите код

   
 
 автор: chelovek   (27.09.2006 в 18:20)   письмо автору
 
   для: 12345   (27.09.2006 в 11:44)
 


function insPic(param1, param2){
        param1 = brkL + param1 + (param2 == brkR ? '=' : brkR);
        var FlagParam = (param2 != null ? true : false);
        var s = TextareaObject.value;
        var insPosL, insPosR;
        if(TextareaObject.selectionEnd == null){ //IE
            var tR = document.selection.createRange();
            var ch = 'character'
            var tR1 = document.body.createTextRange();
            if(tR.parentElement && tR.parentElement() != TextareaObject){
                insPosL = insPosR = s.length;
            }else{
                insPosL = tR.text.length;
                tR1.moveToElementText(TextareaObject);
                tR.setEndPoint('StartToStart', tR1);
                insPosR = tR.text.length;
                insPosL = insPosR - insPosL;
            }
        }else{ //Opera
            insPosL = TextareaObject.selectionStart;
            insPosR = TextareaObject.selectionEnd;
        }
        var insText = s.substring(insPosL, insPosR);
        if(!FlagParam){
            param2 = param1;
            param1 = '';
        }

        TextareaObject.value = s.substring(0, insPosL) + param1 + insText + param2 + s.substring(insPosR, s.length);
        var insCursor = insPosR + param1.length + (!FlagParam || insPosL != insPosR ? param2.length : 0);
        var insCursorL = insCursor;        
        if(document.body.createTextRange){    //IE

            setTimeout("var t = TextareaObject.createTextRange(); t.collapse(); t.moveEnd('" + ch + "', " + insCursor + "); t.moveStart('" + ch + "', " + insCursorL + "); t.select();", 1);

        }else{                    //Opera
            if(document.all) TextareaObject.focus();
            if(TextareaObject.selectionEnd != null){
                TextareaObject.selectionStart = insCursorL;
                TextareaObject.selectionEnd = insCursor + (document.all ? 1 : 0)
                setTimeout("TextareaObject.focus();", 100);
                if(document.all){
                    var tR = document.selection.createRange();
                    if(insCursorL == insCursor) tR.collapse();
                    else     tR.moveEnd('character', -1);
                    tR.select();
                }
            }
        }
    }

   
 
 автор: 12345   (27.09.2006 в 18:59)   письмо автору
 
   для: chelovek   (27.09.2006 в 18:20)
 

Ну это неполный, как я его буду тестировать?
Покажите рабочую страницу или ссылку на неё.

...(дополнение)
Ну вот подключил свой остаток функций к Вашей - работает, вставляет [ smile] в позицию курсора (IE6)

   
 
 автор: chelovek   (27.09.2006 в 19:14)   письмо автору
 
   для: 12345   (27.09.2006 в 18:59)
 

Sorry.
... в прикрепленном файле полная страничка...

   
 
 автор: 12345   (27.09.2006 в 19:43)   письмо автору
 
   для: chelovek   (27.09.2006 в 19:14)
 

А, понятно - в исходном скрипте какие события - onmousedown, а у вас - onclick.
Место ошибки нашли верное, туда выходит программа в IE.
Но у Вас ещё в Опере и FF скрипт не работал. Чтобы работал правильно,
для Оперы - не надо забывать и выбрасывать insBeg=1; в onload;
для FF писать
tt=document.getElementsByName('TypeMold')[0];
var Marker = tt.options[tt.selectedIndex].value;
а не window.TypeMold

Работающий скрипт прикреплён.

   
 
 автор: chelovek   (27.09.2006 в 20:34)   письмо автору
 
   для: 12345   (27.09.2006 в 19:43)
 

Спасибо 12345, помог! Жили бы мы в одном городе - я бы тебе пиво поставил! :)

   
 
 автор: 12345   (28.09.2006 в 13:10)   письмо автору
 
   для: chelovek   (27.09.2006 в 20:34)
 

Спасибо, не стОит :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования