|
|
|
| Объясните пожалуйста парумоментов в скрипте из примера по адресу:
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(); делает ссылку на текст, как то так...
Спасибо всем большое... | |
|
|
|
|
|
|
|
для: chelovek
(25.09.2006 в 17:59)
| | Это мой код и мои комментарии. Баги были в том, что в Опере курсор попадал не туда, а на соседнюю позицию, поэтому для неё +1.
Эта часть кода выставляет курсор на правильную, удобную для юзера позицию, его положение зависит от того, выделен был текст вначале или нет. Все правила установки очень кратко на демонстрационном примере описаны.
Про объект TextRange - http://javascript.aho.ru/files/js/TextRange.html
Часть кнопок и функций, конечно, можете выбросить, смотря по тому, что в результате нужно. | |
|
|
|
|
|
|
|
для: 12345
(25.09.2006 в 18:08)
| | Все равно немножко я не понял, а зачем тогда функция SetTimeout нужна? | |
|
|
|
|
|
|
|
для: chelovek
(25.09.2006 в 18:35)
| | Тоже обход багов. Без неё не устанавливается курсор в поле вообще. В статье об этом упомянуто. Насколько помню, только FF мог без setTimeout установить курсор. | |
|
|
|
|
|
|
|
для: 12345
(25.09.2006 в 18:55)
| | У меня возник еще один вопрос по этому поводу:
С кодом я разобрался, все ненужное убрал, но возникла такая проблема: Если на страничку поместить буттон, который вставляет, например SMILE, то работает не верно - вставка происходит не в позицию курсора, а в конец всего текста. Это, как я понял происходит из за условия:
if(tR.parentElement && tR.parentElement() != TextareaObject){
...
}
|
А вот как его провильно исправить не могу сообразить... Подскажите пожалуйста... | |
|
|
|
|
|
|
|
для: chelovek
(26.09.2006 в 12:10)
| | up | |
|
|
|
|
|
|
|
для: chelovek
(27.09.2006 в 06:56)
| | Покажите код | |
|
|
|
|
|
|
|
для: 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();
}
}
}
}
|
| |
|
|
|
|
|
|
|
для: chelovek
(27.09.2006 в 18:20)
| | Ну это неполный, как я его буду тестировать?
Покажите рабочую страницу или ссылку на неё.
...(дополнение)
Ну вот подключил свой остаток функций к Вашей - работает, вставляет [ smile] в позицию курсора (IE6) | |
|
|
|
|
|
|
|
для: 12345
(27.09.2006 в 18:59)
| | Sorry.
... в прикрепленном файле полная страничка... | |
|
|
|
|
|
|
|
для: 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
Работающий скрипт прикреплён. | |
|
|
|
|
|
|
|
для: 12345
(27.09.2006 в 19:43)
| | Спасибо 12345, помог! Жили бы мы в одном городе - я бы тебе пиво поставил! :) | |
|
|
|
|
|
|
|
для: chelovek
(27.09.2006 в 20:34)
| | Спасибо, не стОит :) | |
|
|
|