Показать сообщение отдельно
  #3 (permalink)  
Старый 01.03.2009, 00:28
Аспирант
Отправить личное сообщение для mister_maxim Посмотреть профиль Найти все сообщения от mister_maxim
 
Регистрация: 09.02.2009
Сообщений: 57

Цитата:
Лучше не опираться на execCommand, а работать с выделением и "оборачивать" элементы через DOM.
понятно, но прочитав инфу по объекту Range я ужаснулся.. как все там интуитивно не понятно.. ну не въехал я в его функциональную полноту, например как там узнать самое элементарное - совпадают ли конечная и начальная точка области - с этим больше всего намучился.
Но после постоянных пыток-попыток я достиг в опере довольно неплохого(во всяком случае для себя приемлемого, однако не идеального) решения:
execCommand=function(win,command, val)
{		
		if($.browser.opera){
			var s=win.getSelection();
	                var r=s.getRangeAt(0);
	           if(r.cloneContents().textContent=="")								
			{
	       	 	var n = win.document.createElement('span');
				n.innerHTML = ' ';
				n.id="cursor";
	       	 	r.insertNode(n);
	       	 	s.removeAllRanges();
				s.addRange(r);
			};
		};
		win.document.execCommand(command,false,val);
};

это надстройка над уже существующим методом execCommand
($ - знак объекта jQuery если кто не знает)
далее. а в обработчиках нажатии кнопок и установки курсора мышкой, т.е. в методах $(doc).mousedown, $(doc).mouseup и $(doc).keydown
удалять искусственный курсор:
var el = $("#cursor",doc);
    	if(el.html() == ' ')
		{
			el.remove();
		}else{
			el.removeAttr('id');
		};

конечно хотелось бы чтобы при приемении форматирования к пустому курсору(не выделению) не появлялся бы на глаза выделяемый прямоугольничек.. ,как не пробывал его удалить с глаз - без него нельзя, но это уже мелочь, замечу что в казалось бы продвинутом tiny редакторе данная проблема вообще не решается.. и там не устранен глюк с мультиформатированием в опере.
Вообщем правило для Оперы как я понял таково - мультиформатирование можно применять только к непустой области выделения(не к курсору).
Ответить с цитированием