0

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

我们在 Delphi 中使用标准的 TWebbrowser 组件,该组件在内部使用 mshtml.dll。另外,我们使用注册表来确保页面使用新的渲染引擎(Web-Browser-Control-Specifying-the-IE-VersionMSDN: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 中的文本,

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

WebBrowser 中的文本,用户输入了一个

代码是:

<!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。这可能会导致渲染的一些不同行为。

4

1 回答 1

0

考虑删除每行之前的空格,会让您朝着正确的方向前进,但离您应该做的还很远:将数据信息转换为 HTML before IPersistStreamInit.Load

由于HTML 规范规定 HTML 代码中的任何空白都应被视为空白的单个实例(<pre>标签内部除外),因此当您在它们周围编辑时,IE 的设计模式与这些额外的空白混淆是可以理解的。你偶然发现了一个边境案件。

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

但是Navigate('about:<html><body></body></html>');document.body.innerText:=...相反,

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

  • 解析文本以折叠任何/所有连续的空格,
  • 全部替换&&amp;, <with&lt;等...
  • (也许还有#13#10with'<br />'#13#10#13#10with '</p><p>'?)
于 2014-11-20T10:56:56.860 回答