MSHTML PasteHTML()生成

时间:2014-11-19 13:37:01

标签: delphi mshtml

我们在Delphi中使用标准的TWebbrowser组件,它在内部使用mshtml.dll。另外,我们使用注册表来确保使用新的呈现引擎(Web-Browser-Control-Specifying-the-IE-VersionMSDN: FEATURE_BROWSER_EMULATION)呈现页面。所以我们使用IE 10的渲染,但我们有相同的结果,即8到11。

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

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

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

现在我们遇到以下问题: 当我们使用IHTMLTxtRange.pasteHTML(...)插入HTML代码时,某些空格会被& nbsp;

取代
procedure TForm1.BT_PasteHtmlClick(Sender: TObject);
var
  mDoc2: IHTMLDocument2;
  mOvSel:IHTMLSelectionObject;
  mRange: IHTMLTxtRange;
  mHtml: string;
begin
  /// Reproduzierbarer Fehler bei PasteHtml
  ///  Leere Zellen und falsche Umbrüche.
  mDoc2 := WB_Test.Document as IHTMLDocument2;

  mOvSel := mDoc2.selection as IHTMLSelectionObject;
  mRange := mOvSel.CreateRange() as IHTMLTxtRange;

  mHtml := '<TABLE width="100%" border="1" cellspacing="0" cellpadding="0">  <TBODY>  <TR>    <TD>Falsche Zellen werden erstellt, wo nur diese eine sein sollte!</TD></TR></TBODY></TABLE>' + sLineBreak +
           '<p>Falsche Umbrueche '  + sLineBreak + 
           'wo keine sein sollten  durch CRLF im Html-Code!</p>' + sLineBreak;
  mRange.pasteHTML(mHtml);
end;

查看插入的代码,TABLE,TBODY,TR和TD标记之间的空格已转换为&amp; nbsp;。 错误插入的HTML代码是:

<TABLE width="100%" border="1" cellspacing="0" cellpadding="0">&nbsp; 
  <TBODY>&nbsp; 
  <TR>&nbsp;&nbsp;&nbsp; 
    <TD>Falsche Zellen werden erstellt, wo nur diese eine sein 
  sollte!</TD></TR></TBODY></TABLE><BR>
<P>Falsche Umbrueche <BR>wo keine sein sollten&nbsp; durch CRLF im 
Html-Code!</P>

编辑: 我们从以下HTML开始:

<html>
  <body>
  </body>
</html>

插入后得到:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv="Content-Type" content="text/html; charset=windows-1252">
<META name="GENERATOR" content="MSHTML 10.00.9200.16540"></HEAD>
<BODY> 
<TABLE border="1" cellspacing="0" cellpadding="0">
  <TBODY>
  <TR>
    <TD>Tabelle mit<BR>einem Text!</TD></TR></TBODY></TABLE><BR>
<P>Falsche Umbrüche durch zu viele&nbsp; Leerzeichen</P></BODY></HTML>

1 个答案:

答案 0 :(得分:2)

这可能是设计上的。符合HTML specifications,HTML代码中的任何空格都应被视为空格的单个实例(<pre>标记内除外)。要在设计模式下键入两个或多个空格时提供额外的单词分隔,IE会插入&nbsp; HTML实体。