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