function nodeList(parentNode, list, level) {
var i, node, count;
if (!list) list = new Array();
level++;
for (i = 0; i < parentNode.childNodes.length; i++) {
node = parentNode.childNodes[i];
if (node.nodeType != 1) continue;
count = list.length;
list[count] = new Array();
list[count][0] = node;
list[count][1] = level;
nodeList(node, list, level);
}
return list;
}
// rgbNormal - приводит цвет к стандарту #RRGGBB
function rgbNormal(color) {
color = color.toString();
var re = /rgb\((.*?)\)/i;
if(re.test(color)) {
compose = RegExp.$1.split(",");
var hex = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'];
var result = "#";
for (var i = 0; i < compose.length; i++) {
rgb = parseInt(compose[i]);
result += hex[parseInt(rgb / 16)] + hex[rgb % 16];
}
return result;
} else return color;
}
function execCommandImitation(start, end) {
// Cтавим ForeColor-форматирование с помощью специального цвета
doc.execCommand("ForeColor", false, "#f5F856");
// Получаем все элементы форматируемого документа
var allNodes = nodeList(doc.body, false, 0);
// Сортируем их по уровню вложенности
var maxLevel = 0;
for (i = 0; i < allNodes.length; i++) {
maxLevel = allNodes[i][1] > maxLevel ? allNodes[i][1] : maxLevel;
}
// 4. Для всех элементов заменяем FONT и SPAN со специальным цветом на переданный код
var node, newnode, color, parent;
for (j = maxLevel; j >= 1; j--) {
for (i = 0; i < allNodes.length; i++) {
if (allNodes[i][1] != j) continue;
node = allNodes[i][0];
sname = node.nodeName.toLowerCase();
color = node.color ? rgbNormal(node.color) : rgbNormal(node.style.color);
if (color) color = color.toLowerCase();
if (sname == "font" || sname == "span" && color == "#f5f856") {
try {
node.innerHTML = start + node.innerHTML + end;
} catch(e) {}
parent = node.parentNode;
while (node.childNodes.length > 0) parent.insertBefore(node.firstChild, node);
parent.removeChild(node);
}
}
}
ifr.focus();
}
</script>
<span onclick="execCommandImitation('<div align=\'right\'>','</div>')">Вправо</span>
Метод конечно не идеален, но принцип ясен. Используя execCommand выделяем каким-особенным цветом текст (или другим параметром) и потом меняем это на своё.
Недостаток - такое форматирование не обратимо