IHTMLTxtRange.pasteHTML не заменяет старый HTML - PullRequest
3 голосов
/ 25 августа 2009

Я пишу простой редактор WYSIWYG в формате HTML, используя Microsoft Mshtml. Одной из особенностей должен быть выбор типа заголовка (например, h1, h2, h3) для выбранного текста. Первое назначение не проблема со следующим кодом:

// *doc* is my IHTMLDocument
// *tag* contains the header tag

IHTMLTxtRange range = (IHTMLTxtRange)doc.selection.createRange()
string rangeText = range.text;
IHTMLElement elem = doc.createElement(tag)
elem.innerHTML = rangeText;
range.pasteHTML(elem.outerHTML);

Когда я пытаюсь изменить заголовок, старый не заменяется, хотя MSDN говорит о pasteHTML:

Вставляет HTML-текст в заданный текст диапазон, заменяя любой предыдущий текст и HTML элементы в ассортименте.

Это означает, что если мой HTML был

<H1>foo</H1>

после первого назначения получает

<H1>
<H2>asdasd</H2></H1>

после второго.

Что я делаю не так? Я что-то упустил?

Ответы [ 3 ]

1 голос
/ 27 ноября 2014

У меня была такая же проблема и я решил ее через

   string rangeText = range.text;
    IHTMLDOMNode parentNode = range.parentElement() as IHTMLDOMNode;
    if (parentNode.nodeName.Contains("H") && parentNode.nodeName.Length == 2)
    {
        parentNode.removeNode(true);
    }
    IHTMLElement elem = doc.createElement(tag);
    elem.innerHTML = rangeText; 
    range.pasteHTML(elem.outerHTML); 
1 голос
/ 04 января 2010

Вы пытались изменить последнюю строку на

range.pasteHTML(elem.innerHTML);

? Я думаю, что externalHTML будет включать оригинальный тег h1, а затем вы вставите

<H1><H2>asdasd</H2></H1>   

OVER

<H1>foo</H1>
0 голосов
/ 05 октября 2011

Очистка выбора сделает это:

IHTMLTxtRange range = (IHTMLTxtRange)doc.selection.createRange();
string rangeText = range.text; 
doc.selection.clear();
IHTMLElement elem = doc.createElement(tag); 
elem.innerHTML = rangeText; 
range.pasteHTML(elem.outerHTML); 
...