Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   несколько execCommand в Opera (https://javascript.ru/forum/events/2919-neskolko-execcommand-v-opera.html)

mister_maxim 26.02.2009 12:43

несколько execCommand в Opera
 
Здравствуйте, кто-нибудь знает как в Опере применить форматирование текста по нескольким парметрам сразу? Например вот так подряд:
Код:

oifr.document.execCommand("FontSize",false,"7");
oifr.document.execCommand("ForeColor",false,"#ff0000");

не срабатывает в Опере ни какое форматирование: ни шрифт большим не становится ни цвет красным. По отдельности работает, например еси какую-либо из этих двух строчек закоментировать. Еще работает только установка большого размера текста если между этими двумя строками поставить программную имитацию нажатия кнопки:
Код:

oifr.document.execCommand("FontSize",false,"7");
oifr.document.keydown();
oifr.document.execCommand("ForeColor",false,"#ff0000");

задержка по времени не помогает. а строка между ними как я понимаю просто аннулирует действие последующей команды в Опере, ровно как и сама команда execCommand ни себе выполниться не дает ни последующим.

Выход пока вижу один.. после каждого применения параметра форматирования ставить программно один символ, после завершения всех параметров по которым надо отформатировать удалить весь образованный вспомогательный текст из этих символов и сохранить при этом достигнутое мультиформатирование. Только как это конкретно сделать, какими конкретными командами...?

Андрей Параничев 26.02.2009 17:59

Это wysiwyg форма? Лучше не опираться на execCommand, а работать с выделением и "оборачивать" элементы через DOM.

mister_maxim 01.03.2009 00:28

Цитата:

Лучше не опираться на 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 редакторе данная проблема вообще не решается.. и там не устранен глюк с мультиформатированием в опере.
Вообщем правило для Оперы как я понял таково - мультиформатирование можно применять только к непустой области выделения(не к курсору).

Андрей Параничев 01.03.2009 03:16

mister_maxim,
В работе с выделением и с клавиатурным вводом в браузере Опера - сплошные проблемы.


Часовой пояс GMT +3, время: 16:59.