Вопрос о обработке выделения внутри textarea.

Бочонок

http://frontender.info
Вопрос о обработке выделения внутри textarea.

Доброго времени суток.

Есть необходимость вставлять поле курсора или вместо выделения в textarea дополнительный код.

При попытке разобратся я совершенно запутался в том объеме документации который нашел на эту тему. :(

В Mozilla,Netscape и FireFox вариант наиболее простой - selectionStart и selectionEnd.

В IE вроде бы существует некий объект selection и метод getSelection() который впрочем отказывается реагировать на текст внутри textarea, так как при нажатии на кнопку (блок div вообще то) он теряет фокус...

Что нужно использовать в Opera осталась загадкой.

И при этом все глючит во всем а в моих руках так и просто не работает ссылаясь на то, что не существует...:confused: :confused:

Помогите мне не сойти с ума в этих дебрях !
Направьте на путь истинный !
Обьясните с помощью чего это реализуют НОРМАЛЬНЫЕ люди и как они при этом добиваются кросброузерности ???

Очень-очень надеюсь на вашу помощь.
Что то я совсем в этой задаче запутался...
 

Бочонок

http://frontender.info
Написал скриптик, который работает для
IE v6.0 Opera v8.x Mozilla v1.4 FireFox v1.0 Netscape v7.2
Код приложен ниже.
Вопрос таков:
1. Как оперировать с положением курсора/выделением в Opera 7.x. Ну хотя бы с 7.54.
2. Кто то может проверить работает ли код в IE 5.x ?

на странице :
PHP:
<div class="italic_b" onclick="insertAtCaret('main_news', 'I');"></div>
<div class="bold_b" onclick="insertAtCaret('main_news', 'B');"></div>
<div class="right_b" onclick="insertAtCaret('main_news', 'R');"></div>
<div class="justify_b" onclick="insertAtCaret('main_news', 'J');"></div>
<div class="left_b" onclick="insertAtCaret('main_news', 'L');"></div>

<textarea id='main_news' name='main_news' tabindex='6' class='TA' rows='60' cols='40' 
onclick="storeCaret(this);  return_focus(this);"  
onkeyup="storeCaret(this);  return_focus(this);" 
ondblclick="storeCaret(this);  return_focus(this);"></textarea>
В фалйле со скриптом
PHP:
function storeCaret(textEl) {
       if (textEl.createTextRange){
         textEl.caretPos = document.selection.createRange().duplicate();
       }
}
     
function insertAtCaret (t_area, text_in) {
var textEl=document.getElementById(t_area);
var sign='';

//IE v6.0 Opera v8.x
       if (textEl.createTextRange && textEl.caretPos) {
         var caretPos = textEl.caretPos;
          if(caretPos.text.length>0){
          	caretPos.text = '['+text_in+']'+ caretPos.text + '[/'+text_in+']';
          	return;
          }else{
          	
          	if(textEl.text_in==undefined){
				textEl.text_in=1;
          	}
        		
          	switch(textEl.text_in){
				case 1:
					sign='['+text_in+']';
					textEl.text_in=2;
				break;
				case 2:
					sign='[/'+text_in+']';
					textEl.text_in=1;
				break;
			}

         	caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? sign + ' ' : sign;
         	return;
          }
       }
// Mozilla v1.4 FireFox v1.0 Netscape v7.2 Opera v8.x
	if(textEl.selectionStart!==undefined){
		if(textEl.selectionStart!==textEl.selectionEnd){
			var part_1,part_2,part_3;
			part_1 = textEl.value.substring(0, textEl.selectionStart);
			part_2 = textEl.value.substring(textEl.selectionStart,textEl.selectionEnd);
			part_3 = textEl.value.substring(textEl.selectionEnd,textEl.value.length);
			textEl.value = part_1+'['+text_in+']'+part_2+'[/'+text_in+']'+part_3;
			return;
		}else{
			
			if(!textEl.getAttribute(text_in)){
				textEl.setAttribute(text_in,1);
			}

		          	switch(textEl.getAttribute(text_in)){
						case '1':
							sign='['+text_in+']';
							textEl.setAttribute(text_in,2);
						break;
						case '2':
							sign='[/'+text_in+']';
							textEl.setAttribute(text_in,1);
						break;
					}

			if(!textEl.getAttribute('not_in_focus')){
			textEl.setAttribute('not_in_focus',2);
			}
			var pos;
			
		          	switch(textEl.getAttribute('not_in_focus')){
						case '1':
							pos=parseInt(textEl.getAttribute('last_pos'));
							textEl.setAttribute('last_pos',pos + parseInt(sign.length));
						break;
						case '2':
							pos = parseInt(textEl.selectionStart);
							textEl.setAttribute('last_pos',pos + parseInt(sign.length));
							textEl.setAttribute('not_in_focus',1);
						break;
					}

			var part_1,part_2;
			part_1 = textEl.value.substring(0, pos);
			part_2 = textEl.value.substring(pos,textEl.value.length);
			textEl.value = part_1+sign+part_2;
			return;
		}
	}



}

function return_focus(obj){
	if(obj.selectionStart!==undefined){
		obj.setAttribute('not_in_focus',2);
	}
}
-~{}~ 07.03.06 14:50:

Неужели никто не подскажет как справиться со злопастной оперой.
 
Сверху