IHTMLTxtRange.pasteHTML不会替换旧的HTML

时间:2009-08-25 13:46:44

标签: c# mshtml

我正在使用Microsoft的mshtml编写一个简单的HTML WYSIWYG编辑器。其中一个特征应该是为所选文本选择标题类型(例如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 个答案:

答案 0 :(得分:1)

您是否尝试过将最后一行更改为

range.pasteHTML(elem.innerHTML);

?  我认为outerHTML会包含原始的h1标签,然后你会粘贴

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

OVER

<H1>foo</H1>

答案 1 :(得分:1)

我有同样的问题并通过

解决了
   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); 

答案 2 :(得分:0)

清除选择将执行此操作:

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);