| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. После обработки этих двух событий мы имеем всю информацию о новом окне. ЗЫ Не проверял Добавлено @ 23:58
В этом случае можно просто попытаться использовать параметр TargetFrameName у OnBeforeNavigate, однако это оставит дыру если юзер кликнет на ссылке, зажимая клавишу Shift, или из popup-menu к примеру. |
| Автор: Усатый 14.9.2005, 22:19 |
| А как быть, если нужно запретить открытие URL в новом окне и принудительно открыть его в том же? |
| Автор: December 16.9.2005, 21:51 | ||||
Скорее всего, так: в событии onNewWindow пишем
Не проверял... Если не работает - маякни, что-нить придумаем. |
| Автор: Усатый 19.9.2005, 23:05 |
| А что значит этот код? Результат: новое окно не открывается. Но и перехода по ссылке тоже не происходит. |
| Автор: December 20.9.2005, 09:33 | ||
По идее, аргумент ppDisp является указателем на инстанцию TWebBrowser, в котором должна открыться страница. Ладно, домой приду - разберусь (часов через 9 |
| Автор: December 2.10.2005, 19:38 | ||
| Не прошло и трёх недель, как руки дошли до этого топика С виду лёгкая задача вылилась в несколько часов сражений с ТВебБродилкой. Выяснилось следующее. 1. Приведённый выше пример таки работает... Когда попытка создать новое окно происходит из некоего вложенного фрейма. По-красивому перенаправить новое окно на самое себя не получается. 2. Задача всё же решаема, хоть и через некоторое шаманство. Для ритуала потребуется дополнительный TWebBrowser. Краткое содержание шаманской песни: при открытии новой отдельной страницы она направляется в запасной бродильник (TWebBrowser2), в котором мы коварно поджидаем события OnBeforeNavigate. В этом событии нам уже доступна информация о урле, флагах, пост-данных etc, и мы смело запускаем Navigate первого (основного) бродильника с этими параметрами. Таинство обряда: чтобы это сработало, надо иметь в запасном бродильнике созданный документ, например, путём навигации на about:blank. Ниже я привожу код, который демонстрирует данную технику. Для его прогона потребуютя Button1, WebBrowser1 и WebBrowser2.
|
| Автор: Усатый 11.10.2005, 23:24 |
| Странно... Зацикливается между WebBrowser1NewWindow2 и WebBrowser2BeforeNavigate2 |
| Автор: December 12.10.2005, 07:28 | ||
Усатый
|
| Автор: Усатый 12.10.2005, 22:21 |
| Разобрался. Первому браузеру нельзя передавать TargetFrameName, поскольку он указывает на НОВОЕ окно - вот они и гоняют страницу друг другу |
| Автор: doneto 20.11.2017, 02:13 |
| а исходный код можно? ( что бы понять - что же все таки надо делать - когда браузер (элемент TWEbBrowser) пытается открыть ссылку в новом окне IE ( т..к. в html- написано ссылку открыть в _blank) - в новом окне... так как же ее перехватить? |