使用Tidhttp和Twebbrowser

5

我正在使用tidhttp控件来加速Twebbrowser中网页的加载。直接导航到URL较慢,因此我不使用(WebBrowser1.Navigate('some_url_here'))。这是我的做法:

procedure TForm1.Button2Click(Sender: TObject);
  procedure LoadHtmlIntoBrowser(var WB: TweBbrowser; const HTMLString: string);
  var
    v: OleVariant;
    HTMLDocument: IHTMLDocument2;
  begin
    WB.Navigate('about:blank');
    while WB.ReadyState < READYSTATE_INTERACTIVE do
      forms.Application.ProcessMessages;

    if Assigned(WB.Document) then
    begin
      HTMLDocument := WB.Document as IHTMLDocument2;
      v := VarArrayCreate([0, 0], varVariant);
      v[0] := HTMLString;
      HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
      HTMLDocument.Close;
    end;
    forms.Application.ProcessMessages;
  end;

var
  str:string;
begin
  str:=idhttp1.Get('http://localhost/myhome.html');
  LoadHtmlIntoBrowser(WebBrowser1,str);
end;

我使用idHTTP将HTML内容获取到一个字符串中,然后直接将该字符串写入Webbrowser。我设置了本地Web服务器(XAMPP)。问题在于,在HTML内容被写入浏览器后,当我单击显示的链接时,它不起作用,即显示大多数空白页面,并在顶部显示“twopage.html”。右键单击并选择“查看源代码”,我得到了"<html>twopage.html</html>",这很奇怪,不是实际页面的HTML。
“myhome.html”文件包含:
<html>
  <head></head>
  <body><h1>My home</h1><a href="twopage.html"></a></body>
</html>

另一个网页"twopage.html"包含以下内容:
<html>
  <head></head>
  <body><h1>Another Webpage</h1></body>
</html>

3
您的网络浏览器没有“基本网址”来正确构建相对链接,就像当您实际导航到http://somewhere时它通常所做的那样。我不知道您是否可以“通知”它基本网址是什么,但您肯定可以更改“myhome.html”文件以包括绝对链接,例如<a href="http://localhost/twopage.html">,我敢打赌这会在您的设置中起作用。另一方面,我真的不明白这如何显着提高页面加载时间,并且我不确定它是否适用于涉及相关资源(例如CSS、图像等)的复杂页面。 - jachguate
我同意@jachguate的观点,如果没有至少一个真正的导航到所需位置,可能甚至不可能 - TLama
我正在将链接转换为绝对链接。这并不能解决问题,只是一种权宜之计。目前来说这已经足够了。谢谢。 - megatr0n
@Jachguate,我认为这段特定的代码和本地服务器只是用于测试。使用远程服务器,这可以用于“预加载”某些页面。但是,如果这是意图,那么我们并不真正关心TWebBrowser是否可以直接导航到其他链接,因为我们希望从预加载缓存中获取它们。如果这不仅仅是为了测试,那么使用绝对链接并不是一个很好的解决方法,因为整个东西感觉像是为了解决其他问题而采取的一种权宜之计。 - Rob Kennedy
1
@jachguate:在将HTML加载到“webbrowser”之前,您可以在其中插入一个<base>标签,以便Web浏览器具有基本URL来解析相对链接。 - Remy Lebeau
显示剩余2条评论
1个回答

7

在将HTML加载到Web浏览器中之前,您需要插入一个<base>标记,以便在解析相对URL时有一个基本URL可用。


这个很好用。Remy,我也想和你“私下”讨论一个问题。 - megatr0n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接