Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

Переход по ссылке в WebBrowser e   Найти похожие ветки 

 
Alexei ©   (2009-06-27 23:35) [0]

Здравствуйте, мастера Delphi! Пишу программу, в которой WebBrowser отображает страницы, исходные html-коды которых «загружается» в WebBrowser из компонента Memo. При клике по ссылке на другой раздел одной и той же страницы (html-документа), загруженной из Мемо, в WebBrowser’e появляется текст «blank#Zakladka», где Zakladka – имя закладки на другой раздел. В IE и Firefox всё корректно работает (если открывать html-файл с этим кодом). В чём может быть проблема моей программы?


 
Palladin ©   (2009-06-29 17:04) [1]

Ошибка в 17 строке


 
brother ©   (2009-06-30 11:34) [2]

> исходные html-коды которых «загружается» в WebBrowser из
> компонента Memo

ндя...

> в WebBrowser’e появляется текст «blank#Zakladka»,

это называется линк...
ты не сказал, что происходит если нажать на линк в твоей проге.


 
sniknik ©   (2009-06-30 12:04) [3]

> ты не сказал, что происходит если нажать на линк в твоей проге.
переход на "якорь" в той же странице. вернее "непереход" в программе(WebBrowser), и нормальный переход если html открыт файлом в браузере.

все же ясно описано. и ответ в [1] на 100% верен...


 
brother ©   (2009-07-01 09:11) [4]

ах, это якорь...


 
Alexei ©   (2009-07-01 19:47) [5]

Уточню свой вопрос. WebBrowser в моей программе работает не с файлами: html загружается из DBMemo (из БД). => WebBrowser’у неизвестны URL’ы загружаемых страниц. Отсюда и – «blank#Zakladka» (URL=’about:blank#Zakladka’). Если работать с файлами, в моей проге всё нормально работает – проверил! Но это не то, что мне надо.

В общем, задача сводится к следующему. В html-коде есть ссылка <a href=”#Yakor”>Link</a> на якорь <a name=”Yakor”>Другой раздел</a>. В обработчике события WebBrowserBeforeNavigate2 определяем строку якоря. Вопрос в том, как прокрутить WebBrowser до нужного якоря (до определенной строки html-кода)?


 
TIF ©   (2009-07-02 00:36) [6]

> как прокрутить WebBrowser до нужного якоря (до определенной
> строки html-кода)

ВебБраузер САМ прокрутит страницу до "якоря" при переходе (навигации) по правильной ссылке. Если программисту и остаётся что-то в этом случае крутить, то только пальцем у виска )))))

Вывод: нужна правильная ссылка

Берём лопату, роем дальше

> Пишу программу, в которой WebBrowser отображает страницы,
>  исходные html-коды которых «загружается» в WebBrowser из
> компонента Memo

Ужас какой

Исходный код страниц, то есть сам html-документ изначально нужно сохранять в файл (временный), тогда проблема решена - мы загружаем файл с диска, компонент-браузер сам прокручивает его до нужного якоря

Ы?


 
Германн ©   (2009-07-02 00:54) [7]


> Исходный код страниц, то есть сам html-документ изначально
> нужно сохранять в файл (временный), тогда проблема решена
> - мы загружаем файл с диска, компонент-браузер сам прокручивает
> его до нужного якоря

Не спец в данном компоненте. Но какая разница откуда брать текст (набор печатных символов)? Из файла или из мемо какая разница?


 
TIF ©   (2009-07-02 01:13) [8]

> Из файла или из мемо какая разница?

разница именно в навигации...

Сейчас проверил загрузку из memo, правда в TEmbeddedWB, а не стандартный компонент, но разницы вроде особой нет

Вот такой документик
<a href="#Yakor">1</a></p>
<p>2</p>
<p>3</p>
...
<p>9</p>
<p><a name="Yakor">10</a></p>
<p>11</p>
...
<p>20</p>


Загрузили, выполняем EmbeddedWB1.Navigate("#Yakor"); (теоретически должно работать, т.к. адрес текущей страницы вообще существует ли, если она из мемо создана?)
Никакой реакции. Жмём тогда на первую ссылку. Ещё интереснее - открывается пустой документ (хм, может это от IE8 такие фокусы?), в исходном коде которого только <HTML></HTML>


 
TIF ©   (2009-07-02 01:38) [9]

Так. Проверил ещё и TWebBrowser.
Разобрался и убедился, что правильное решение - загрузка из файла :)

Во-первых, поправлю себя:
> EmbeddedWB1.Navigate("#Yakor");
логичнее всё-таки заменить на
WebBrowser1.Navigate(WebBrowser1.LocationURL+"#Yakor");
LocationURL - URL текущей (загруженной) страницы

Во-вторых,
> Ещё интереснее - открывается пустой документ
Если перед этим нажать F5 и нажать на ссылку - произойдёт переход на якорь, без выкидывания на пустую страницу

В-третьих, ближе к делу :)

Для страницы, загруженной "из кода" (из Memo) навигация по документу не работает. Проблема в том, что у страница получается без своего LocationURL, он оказывается равным about:blank или чему-то там ещё
Для страницы, загруженной из файла всё работает без проблем, так как для неё LocationURL - это путь к htm-файлу на диске

Фух. Теперь вроде всё :-0
PS: если кто-то выложит работающую навигацию по якорям для загруженного из memo html-документа - буду признателен, но я почти уверен, что её не существует в природе


 
int64   (2009-07-02 19:01) [10]

procedure TForm1.Button1Click(Sender: TObject);
begin
 WebBrowser1.Navigate("delphimaster.ru");
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 iDoc: IHTMLDocument2;
begin
 iDoc := IHTMLDocument2(WebBrowser1.Document);
 HTMLAnchorElement(iDoc.anchors.item("PageTop", EmptyParam)).scrollIntoView(0);
end;


 
TIF ©   (2009-07-03 10:52) [11]

> HTMLAnchorElement(iDoc.anchors.item("PageTop", EmptyParam)).
> scrollIntoView(0);

Скроллинг - это вещь, но не представляю, как автор будет вычислять до какого места крутить, чтобы попасть точно "в якорь" )


 
int64   (2009-07-03 15:44) [12]

"PageTop" - это название якоря


 
MonoLife ©   (2009-07-03 16:28) [13]


> Проблема в том, что у страница получается без своего LocationURL,
>  он оказывается равным about:blank или чему-то там ещё

Как вариант, сохранить из мемо временный htm файл и затем открыть его. Нет?


 
TIF ©   (2009-07-04 00:36) [14]

MonoLife ©   (03.07.09 16:28) [13]
> Как вариант, сохранить из мемо временный htm файл и затем
> открыть его. Нет?

Народ, вы хоть читаете предыдущие сообщения? :)
А я что тут уже который день доказываю и предлагаю? )))))

TIF ©   (02.07.09 00:36) [6]
> Исходный код страниц, то есть сам html-документ изначально
> нужно сохранять в файл (временный), тогда проблема решена
> - мы загружаем файл с диска, компонент-браузер сам прокручивает
> его до нужного якоря


imho,вопрос уже исчерпан. Можно даже тему закрывать


 
MonoLife ©   (2009-07-04 06:35) [15]


> TIF ©   (04.07.09 00:36) [14]

сорри, смутили вот эти слова, что я даже забыл про [6]

> ...что её не существует в природе
>


 
MonoLife ©   (2009-07-04 07:01) [16]

Вспоминал как я делал когда-то..
Оказывается в процессе записи кода HTML присваивал не якоря, а
<id ="anchor1">. Затем "находил" в документе элемент (GetElementById) и "делал" скроллинг (scrollIntoView) к этому id..
Так что, это не совсем то...


 
Alexei ©   (2009-07-04 15:32) [17]

Спасибо, int64!!! Всё работает!!! И никаких временных файлов не надо!!!
У меня ещё один вопрос на эту тему. Как осуществить переход в обратном направлении, т.е. как перейти к ссылке <a href=”#Yakor”>Link</a>, если переход к якорю произошёл и, соответственно, нам известен URL=’#Yakor’?
Проверял
iDoc:=IHTMLDocument2(WebBrowser1.Document);
HTMLLinkElement(iDoc.links.item(link_URL, EmptyParam)).scrollIntoView(1);
//LinkURL – URL ссылки (’#Yakor’).

Но появляется ошибка "Access violation at address …’.

Может дело в параметрах index (второй параметр функции item) и / или varargStart (параметр процедуры scrollIntoView)?

Кстати, при переходе к якорю я использую параметр varargStart=1. При этом якорь отображается возле верхнего края WB. Если varargStart=0, якорь отображается возле нижнего края WB.



Страницы: 1 вся ветка

Текущий архив: 2009.08.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
15-1246221005
Юрий
2009-06-29 00:30
2009.08.30
С днем рождения ! 29 июня 2009 понедельник


2-1245711399
Снегурочка
2009-06-23 02:56
2009.08.30
Передача данных Tcp/ip


15-1245995836
Ega23
2009-06-26 09:57
2009.08.30
Веб-дизайнеры есть?


15-1246191388
Дмитрий С
2009-06-28 16:16
2009.08.30
Bluetooth пульт с экраном.


2-1246026729
Vayrus
2009-06-26 18:32
2009.08.30
Проблема с GetKeyDateTime в Win XP