Показать сообщение отдельно
  #15 (permalink)  
Старый 05.06.2010, 19:45
Аватар для Geddar
Кандидат Javascript-наук
Отправить личное сообщение для Geddar Посмотреть профиль Найти все сообщения от Geddar
 
Регистрация: 23.05.2009
Сообщений: 100

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 выделяем каким-особенным цветом текст (или другим параметром) и потом меняем это на своё.
Недостаток - такое форматирование не обратимо
__________________
Обходя грабли ты теряешь драгоценный жизненный опыт!
Ответить с цитированием