【发布时间】:2023-03-24 14:15:01
【问题描述】:
我想添加另一个 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 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。进入设计模式后,通过 reading 从IPersistStreamInit测试/记录源代码。看看你有什么...... -
问题更进一步。我可以获取一个在编辑模式下使用 WebBrowser 完全生成的文档(应该重组为与 DOM 兼容的 HTML)并通过 IPersistStreamInit 再次加载它并具有相同的行为。
标签: html delphi mshtml microsoft.mshtml