MSHTML 出现在编辑

Posted

技术标签:

【中文标题】MSHTML 出现在编辑【英文标题】:MSHTML   appear on editing 【发布时间】:2015-01-18 00:00:36 【问题描述】:

我想添加另一个 MShtml 问题。感谢所有回复。

我们在 Delphi 中使用标准的 TWebbrowser 组件,该组件在内部使用 mshtml.dll。另外,我们使用注册表来确保页面使用新的渲染引擎(Web-Browser-Control-Specifying-the-IE-Version、MSDN: FEATURE_BROWSER_EMULATION)进行渲染。所以我们使用 IE 10 的渲染,但是使用 ie 8 到 ie 11 的结果是一样的。

使用标准的 MSHTML (IE7) 渲染机器可以正常工作,但由于新的渲染选项,我们需要新的 MSHTML 渲染。

我们使用控件的设计模式使用户能够对文档进行更改:

var
  mDocument: IHTMLDocument2;
begin
  mDocument := ((ASender as TWebBrowser).Document as IHTMLDocument2);
  mDocument.designMode := 'on';

现在我们有以下问题: 我们通过 IPersistStreamInit.Load(...) 将以下(简化的)HTML 加载到 WebBrowser 中:

<html>
  <body>
    What should I do 
    with some of the 
    spaces.
  </body>
</html>

在 WebBrowser 用户可以看到以下内容:

现在,当在编辑模式下的 WebBrowser 中选择单词“with”并键入一个字符时,会出现一些空格。 HTML 现在有  在其中 - 与编辑前 HTML 中的空格一样多:

代码是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv="Content-Type" content="text/html; charset=unicode">
<META name="GENERATOR" content="MSHTML 10.00.9200.16540"></HEAD>
<BODY>    What should I do &nbsp;&nbsp;&nbsp;&nbsp; n some of the     spaces. 
</BODY></HTML>

在WebBrowser中替换“空格”这个词也可以达到同样的效果。

这对于使用我们应用程序的用户来说是一种不良行为。

每个文本前面有空格的 HTML 代码都有相同的行为。麻烦的是,MSHTML 本身会生成这样的 HTML。

现在我们想到了一个解决方案来删除每行左侧的所有空格,但我们认为这样的解决方法可能会导致更大的混乱,因为它们会改变 HTML。这可能会导致呈现的一些不同行为。

【问题讨论】:

我建议您将这个关于IPersistStreamInit.Load 的“子问题”添加到上一个问题中,然后删除这个问题,而不是提出新问题。显然这是相关的。在任何情况下,IMO 你要么通过IPersistStreamInit 读/写而忘记MSHTML 编辑,或者使用MSHTML 编辑和解决它的“设计”行为......正如我已经提到的,这是一个有趣的问题。 我不认为这是一个子问题。行为不同。这里我们只使用 IPresistStreamInit.Load(...) 而没有使用 PasteHTML()。在这里,我们希望为用户提供更改内容的可能性。但是当他更改内容时,就会出现空格。 好吧,你从认为(和我一样)相同行为的人那里得到了 -1。是否进行 PasteHTML 或任何其他 DOM 操作都没有关系。一旦 DOM 本身发生变化(在设计模式下),IE 将重构 HTML。进入设计模式后,通过 readingIPersistStreamInit 测试/记录源代码。看看你有什么...... 问题更进一步。我可以获取一个在编辑模式下使用 WebBrowser 完全生成的文档(应该重组为与 DOM 兼容的 HTML)并通过 IPersistStreamInit 再次加载它并具有相同的行为。 【参考方案1】:

考虑删除每行之前的空格,会让您朝着正确的方向前进,但与您应该做的事情相去甚远:在@之前转换数据info HTML 987654322@.

由于HTML specification 规定 HTML 代码中的任何空白都应被视为空白的单个实例(&lt;pre&gt; 标记内除外),因此当您使用这些额外的空格时,IE 的设计模式会混淆这些额外的空格是可以理解的在他们周围编辑。你偶然发现了一个边境案件。

我建议你要么不要使用IPersistStreamInit.Load

但是Navigate('about:&lt;html&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;');document.body.innerText:=... 代替,

或注意正确格式化初始 HTML:

解析文本以折叠任何/所有连续的空格, 将所有&amp;amp; 替换为&amp;amp;,将&amp;lt; 替换为&amp;lt; 等等... (也许还有#13#10'&lt;br /&gt;'#13#10#13#10'&lt;/p&gt;&lt;p&gt;'?)

【讨论】:

感谢您的回复。现在我尝试了另外两种方法,但都没有奏效。第一种是将文件写入磁盘并使用WebBrowser.Navigate2(...) 加载它。第二种是按照@Stijn Sanders 的建议使用document.body.innerText := ....

以上是关于MSHTML 出现在编辑的主要内容,如果未能解决你的问题,请参考以下文章

用Twebbrowser做可控编辑器与MSHTML(调用js)

mshtml.dll被瑞星查毒删除,网页无法打开,瑞星也进不来如何修复

我的系统是XP,我打开记事本的时候出现错误提示,说啥拒绝访问?怎么回事啊?

在 MSHTML 中获取当前用户选择(IHTMLTxtRangePtr)

创建一个基于 MSHTML 的简约窗口

在 MSHTML IE8 中修改 DOM 时是不是会触发事件?