Использование Tidhttp с Twebbrowser

Я использую элемент управления 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. У меня есть локальная настройка веб-сервера (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>

The other webpage, "twopage.html" contains

<html>
  <head></head>
  <body><h1>Another Webpage</h1></body>
</html>

person megatr0n    schedule 15.03.2013    source источник
comment
Ваш веб-браузер не имеет базового URL-адреса для правильного построения относительных ссылок, как это обычно происходит, когда вы действительно переходите к http://somewhere. Я не знаю, можете ли вы сообщить, что это за базовый URL-адрес, но вы наверняка можете изменить свой файл myhome.html, включив в него абсолютные ссылки, например <a href="http://localhost/twopage.html">, которые, я уверен, будут работать в вашем настраивать. С другой стороны, я действительно не понимаю, как это может значительно сократить время загрузки страницы, и я не уверен, что это работает со сложной страницей, включающей связанные ресурсы, такие как css, изображения и тому подобное.   -  person jachguate    schedule 16.03.2013
comment
Я согласен с @jachguate, maybe it's not even possible без хотя бы одного реального перехода в нужное место.   -  person TLama    schedule 16.03.2013
comment
Меняю ссылки на абсолютные. Это не решает проблему, а только работает вокруг нее. Этого пока хватит. Спасибо.   -  person megatr0n    schedule 16.03.2013
comment
@Jachguate, я ожидаю, что этот конкретный код и локальный сервер предназначены только для тестирования. С удаленным сервером это может быть полезно для предварительной загрузки некоторых страниц. Однако, если это намерение, то нас не должно волновать, может ли TWebBrowser напрямую переходить к другим ссылкам, поскольку вместо этого мы хотим получить их из кеша предварительной загрузки. Если это не только для тестирования, то использование абсолютных ссылок не является обходным решением, поскольку все это похоже на обходное решение для какой-то другой проблемы.   -  person Rob Kennedy    schedule 16.03.2013
comment
@jachguate: вы можете вставить тег <base> в HTML перед загрузкой его в webbrowser, чтобы веб-браузер имел базовый URL-адрес для разрешения относительных ссылок.   -  person Remy Lebeau    schedule 16.03.2013
comment
@Rob, вот почему я разместил это как комментарий, а не как ответ, просто дав некоторое представление о причине, но не о решении проблемы.   -  person jachguate    schedule 16.03.2013
comment
@ Реми, ты опубликуешь это как ответ!   -  person jachguate    schedule 16.03.2013


Ответы (1)


Вам необходимо вставить тег <base> в HTML перед загрузкой в ​​веб-браузер, чтобы он имел базовый URL-адрес, доступный при разрешении относительных URL-адресов.

person Remy Lebeau    schedule 16.03.2013
comment
это прекрасно работает. Реми, я также хочу обсудить с тобой вопрос вне эфира. - person megatr0n; 18.03.2013