Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Перехват URL в TWebBrowser


Автор: Borland_Delphi_6 30.3.2005, 15:17
В WebBrowser есть событие OnNewWindow2, но этой процедуре вроде бы не передается URL открываемой страницы. Так вот, можно ли его как-нибудь узнать (нужно для организации вкладок)?

Автор: Snowy 30.3.2005, 15:48
Сначала создавай закладку, а потом, когда страничка подгрузится (OnDocumentComplete), переименовывай.
Лучше даже будет на закладку класть не линк, а заголовок странички (как в Opera)

Автор: Borland_Delphi_6 31.3.2005, 00:49
Snowy
Не, ты не понял. Нужно чтобы вкладка создавалась при попытке открытия ссылки в новом окне (target="_blank"). Но для этого мы должны знать URL нового окна. А его я как раз и не знаю! Вот как его можно узнать (и можно ли...)?

Автор: December 1.4.2005, 00:03
OnBeforeNavigate может тебе помочь

Автор: Borland_Delphi_6 1.4.2005, 18:32
Ок, а как узнать, что браузер пытается открыть новое окно?

Автор: December 1.4.2005, 23:55
Первым выстреливает OnNewWindow. Запоминаем в нём ppDisp. Сразу после него срабатывает OnBeforeNavigate с таким же (по идее) ppDisp'om. После обработки этих двух событий мы имеем всю информацию о новом окне.
ЗЫ Не проверял smile
Добавлено @ 23:58
Цитата(Borland_Delphi_6 @ 31.3.2005, 00:49)
Нужно чтобы вкладка создавалась при попытке открытия ссылки в новом окне (target="_blank").

В этом случае можно просто попытаться использовать параметр TargetFrameName у OnBeforeNavigate, однако это оставит дыру если юзер кликнет на ссылке, зажимая клавишу Shift, или из popup-menu к примеру.

Автор: Усатый 14.9.2005, 22:19
А как быть, если нужно запретить открытие URL в новом окне и принудительно открыть его в том же?

Автор: December 16.9.2005, 21:51
Цитата
А как быть, если нужно запретить открытие URL в новом окне и принудительно открыть его в том же?

Скорее всего, так: в событии onNewWindow пишем
Код

ppDisp:=ControlInterface;

Не проверял... Если не работает - маякни, что-нить придумаем.

Автор: Усатый 19.9.2005, 23:05
А что значит этот код?
Результат: новое окно не открывается. Но и перехода по ссылке тоже не происходит.

Автор: December 20.9.2005, 09:33
Цитата
А что значит этот код?

По идее, аргумент ppDisp является указателем на инстанцию TWebBrowser, в котором должна открыться страница. Ладно, домой приду - разберусь (часов через 9 smile) Завтра выложу код.

Автор: December 2.10.2005, 19:38
Не прошло и трёх недель, как руки дошли до этого топика smile
С виду лёгкая задача вылилась в несколько часов сражений с ТВебБродилкой. Выяснилось следующее.
1. Приведённый выше пример таки работает... Когда попытка создать новое окно происходит из некоего вложенного фрейма. По-красивому перенаправить новое окно на самое себя не получается.
2. Задача всё же решаема, хоть и через некоторое шаманство. Для ритуала потребуется дополнительный TWebBrowser. Краткое содержание шаманской песни: при открытии новой отдельной страницы она направляется в запасной бродильник (TWebBrowser2), в котором мы коварно поджидаем события OnBeforeNavigate. В этом событии нам уже доступна информация о урле, флагах, пост-данных etc, и мы смело запускаем Navigate первого (основного) бродильника с этими параметрами. Таинство обряда: чтобы это сработало, надо иметь в запасном бродильнике созданный документ, например, путём навигации на about:blank. Ниже я привожу код, который демонстрирует данную технику. Для его прогона потребуютя Button1, WebBrowser1 и WebBrowser2.
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
webbrowser1.Navigate('www.bugaga.com');
webbrowser2.Navigate('about:blank');
end;

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
ppDisp:=WebBrowser2.ControlInterface;
end;

procedure TForm1.WebBrowser2BeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
if assigned(WebBrowser2.Document) then
  begin
  WebBrowser1.Navigate(URL, Flags, TargetFrameName, PostData, Headers);
  Cancel:=true;
  end;
end;

Автор: Усатый 11.10.2005, 23:24
Странно... Зацикливается между WebBrowser1NewWindow2 и WebBrowser2BeforeNavigate2 smile

Автор: December 12.10.2005, 07:28
Усатый
Цитата
Странно... Зацикливается между WebBrowser1NewWindow2 и WebBrowser2BeforeNavigate2
Давай код, я посмотрю...

Автор: Усатый 12.10.2005, 22:21
Разобрался. Первому браузеру нельзя передавать TargetFrameName, поскольку он указывает на НОВОЕ окно - вот они и гоняют страницу друг другу smile Достаточно передать URL

Автор: doneto 20.11.2017, 02:13
а исходный код можно? ( что бы понять - что же все таки надо делать - когда браузер (элемент TWEbBrowser) пытается открыть ссылку в новом окне IE ( т..к. в html- написано ссылку открыть в _blank) - в новом окне... так как же ее перехватить?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)