IHTMLTxtRange.pasteHTML 不会替换旧的 HTML

发布于 2024-08-02 15:30:18 字数 752 浏览 8 评论 0原文

我正在使用 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>

位于第二个分配之后。

我做错了什么?我错过了什么吗?

I'm writing a simple HTML WYSIWYG editor using Microsoft's mshtml. One of the features should be selecting a header type (e.g. h1, h2, h3) for a selected text. The first assignment is no problem with the following code:

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

When I try to change the header, the old one doesn't get replaced though MSDN says about pasteHTML:

Pastes HTML text into the given text
range, replacing any previous text and
HTML elements in the range.

This means if my HTML was

<H1>foo</H1>

after the first assignment, it gets

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

after the second.

What am I doing wrong? Am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紫竹語嫣☆ 2024-08-09 15:30:18

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

range.pasteHTML(elem.innerHTML);


我认为 externalHTML 将包含原始的 h1 标签,然后您将粘贴

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

OVER

<H1>foo</H1>

Have you tried changing the last line to

range.pasteHTML(elem.innerHTML);

?
I think the outerHTML would include the original h1 tag, and then you would paste

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

OVER

<H1>foo</H1>
水中月 2024-08-09 15:30:18

我遇到了同样的问题并通过解决了它

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

I had the same problem and solved it via

   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); 
相思故 2024-08-09 15:30:18

清除选择即可:

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

Clearing the selection will do it:

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); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文