我想添加另一个MSHTML问题。感谢所有回复。
我们在Delphi中使用标准的TWebbrowser组件,它在内部使用mshtml.dll。另外,我们使用注册表来确保使用新的呈现引擎(Web-Browser-Control-Specifying-the-IE-Version,MSDN: FEATURE_BROWSER_EMULATION)呈现页面。所以我们使用IE 10的渲染,但我们有相同的结果,即8到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现在有&amp; nbsp;在其中 - 与编辑前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中的“spaces”一词,可以达到同样的效果。
对于使用我们的应用程序的用户来说,这是一种不良行为。
每个带有文本前面空格的HTML代码都具有相同的行为。问题是,MSHTML本身就会生成这样的HTML。
到目前为止,我们想到了一个删除每行左侧所有空格的解决方案,但我们认为这样的变通办法可能会更加混乱,因为它们会改变HTML。这可能会导致渲染的某些不同行为。
答案 0 :(得分:0)
考虑在每行之前删除空格,使您处于正确的方向,但远不及 应该做的那样:在{之前转换数据信息HTML {1}}。
由于HTML specification规定HTML代码中的任何空格都应该被视为空格的单个实例(IPersistStreamInit.Load
标记内除外),IE的设计模式与这些内容混淆是可以理解的编辑它们时会有额外的空格。你偶然发现了边境案件。
我建议您不要使用<pre>
但IPersistStreamInit.Load
和Navigate('about:<html><body></body></html>');
代替,
或注意正确格式化初始HTML:
document.body.innerText:=...
替换为&
,将&
替换为<
等等。<
#13#10
和'<br />'
#13#10#13#10
?)