уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Довольно часто при разработке программ для Веб используется компонент WebBrowser, расположенный на странице палитры компонентов Internet. Этот компонент помогает легко встроить веб-браузер в Ваше приложение и использовать все функциональные возможности IE в своих приложениях.

При этом может возникнуть необходимость обратить внимание пользователя на какой-либо элемент, загруженной в WebBrowser страницы, например на ссылку или изображение. Выводить все ссылки в отдельный список? Не эффективно и может потребовать лишнего места на форме для расположения визуальных компонентов.  Более эффективно каким-либо образом изменить html-код страницы, например выделить ссылки полужирным шрифтом или вставить рядом со ссылкой небольшое изображение. Как это делается — рассмотрим на небольшом примере.

1. Теория

В статье «Что можно «вытащить» из DOMа» мы немного касались таких свойств объекта Document как innerText и outerText. Аналогично этим, есть ещё два свойства: innerHTML и outerHTML. Чтобы понять какую информацию несут в себе эти свойства посмотрите на следующий рисунок:

innerHTMLВ представленном на рисунке фрагменте кода рассмотрены свойства innerHTML/innerText и outerHTML/outerText для элемента страницы «параграф».

Теперь, используя эти свойства Вы сможете всегда найти на странице необходимый элемент и работать с ним.

Что касается вставки своего кода в загруженную страницу, то для этого можно использовать два метода:

  1. insertAdjacentText(where, text: string);
  2. insertAdjacentHTML(where, html: string).

Эти методы очень похожи друг на друга. Единственное различие в них состоит в том, что insertAdjacentHTML позволяет вставить в страницу текст, содержащий html-теги и эти теги будут правильно интерпретированы браузером.

Для того, чтобы воспользоваться этими методами необходимо задать два параметра: where — строка, указывающая в каком месе следует вставить элемент text/html. При этом where может принимать следующие значения:

beforeBeginigafterBegin — вставляет строку text/html после открывающего тега элемента;

beforeBegin — вставляет строку text/html перед открывающим тегом элемента;

afterEnd — вставляет строку text/html после закрывающего тега элемента;

beforeEnd — вставляет строку text/html перед закрывающим тегом элемента;

Теперь рассмотрим все вышесказанное на небольшом примере.

2. Практическая часть

Давайте напишем небольшое приложение, которое будет каким-либо образом отмечать на загруженной странице все ссылки.

Открываем Delphi, создаем новый проект и в главном модуле не забываем подключить в uses модуль MSHTML.

Я не стал сильно «выделываться» в плане интерфейса и сделал вот такую форму приложения:

WBPaint_1 В верхнее поле вводим адрес сайта, жмем «Перейти» и после загрузки страницы начинаем «колдовать» над кодом страницы.

При этом с помощью двух ComboBox’ов я регулирую что и куда вставлять. Первый ComboBox указывает, каким методом пользоваться, а второй — куда вставлять новый элемент/текст.

Теперь обратимся непосредственно к листингам программы.  Во-первых, напомню тем кто забыл и сообщу тем кто ещё не знает, что переход на URL в WebBrowser’е осуществляется вызовом метода Navigate:

WebBrowser1.Navigate(Edit1.Text);

После того, как страница будет загружена, достаточно выполнить следующую процедуру:

procedure TForm1.Button2Click(Sender: TObject);
var DocA: IHTMLElementCollection;
    Element: IHTMLElement;
    i:integer;
begin
  DocA:=(WebBrowser1.Document as IHTMLDocument2).links;
  case ComboBox1.ItemIndex of
    0:begin //Текст
        for i:=0 to DocA.length - 1 do
          begin
            Element:=DocA.item(i,0)as IHTMLElement;
            Element.insertAdjacentText(ComboBox2.Text, Edit2.Text);
          end;
      end;
1:begin //HTML
    for i:=0 to DocA.length - 1 do
      begin
        Element:=DocA.item(i,0)as IHTMLElement;
        Element.insertAdjacentHTML(ComboBox2.Text, Edit2.Text);
      end;
  end;
end;
end;

Здесь, как вы можете заметить, я снова обратился к DOM, а именно — получил коллекцию всех ссылок на странице и поработал с каждой ссылкой в отдельности через переменную Element, вставив рядом с ней необходимый текст. Работающая программа выглядит вот так:

WebBrowserАналогичным образом можно вставлять в код страницы, например, небольшие изображения или вообще полностью изменить все рисунки на страницы — никто Вас не ограничивает :)

Если есть вопросы — прошу задавать.

 

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
30 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Марсель
Марсель
15/12/2009 16:00

спасибо интересненькая довольно таки статья, но вопрос как загрузить только определенную элементы? Тоесть при загрузке удалить лишние элементы?
 

Иван
Иван
10/03/2010 16:47

ВЛАД, отличный материал… столкнулся с проблемой…
я делаю полуавтоматический постинг на форуме…
хочу вытащить поле <input и туда вставить заготовленую тему ..и вытащить …тело сообщение и туда вставить мое сообщение…
чтобы мне нужно было только на сайте нажать кнопку отправить…а поля авотматически заполнялись..
Как мне вытащить поля для ввода и добавить туда мой текст?

ziz
ziz
02/05/2010 08:53

у меня есть более эффективный способ и лёгкий изменить исходный текст))))
memo1.keyup(чтото там);
begin
webbrowser1.oleobject.document.body.innerhtml := memo1.text;
end;
можно также наоборот брать сорс в мемо
у меня есть проблема с webbrowser!!!!
предложите способ отправки файла скрипту на сервере
через put или пост, плиииииииз очень нада
именно с использованием webbrowser! через indy я и так знаю….

Дмитрий
Дмитрий
10/09/2010 21:05

Доброе время суток. Вопрос Автору. Можно ли привести пример со скачиваемым исходником программы, следующего функционала: 1)загружает страницу 2)находит нужную мне форму 3) Заполняет нужным мне текстом нужную форму. БУДУ ПРИМНОГО БЛАГОДАРЕН ЕСЛИ ПОМОЖЕТЕ В РЕШЕНИИ ДАННОЙ ЗАДАЧИ.

Акмал
Акмал
29/09/2010 12:16

Вопрос возможно не по теме.
Я пытаюсь написать GPS трекер.
Использую Delphi+google map api.
Использую компонент webbrowser.
Нарисовать карту с гугла проблем нет, нарисовать на ней линией маршрут тоже не проблема. Проблема заключается в рисовании маршрута в режиме реального времени.
На гугле есть готовые скрипты java, но вот как заставить их работать на уже открытой html странице пока не пойму. Сейчас я просто изменяю текст html страницы и заново даю комманду WebBrowser1.Navigate(Text); что естественно занимает время, а также создает неудобства при работе с программой.

Можете подсказать путь более правильной работы с этой связкой.

Заранее благодарю.

Акмал.

Andrey
Andrey
18/10/2010 19:03

У меня к вам такой вопрос. при загрузки страницы мне надо изменить ее код, то есть не просто вставить что то дополнительное, а в какой то части кода изменить. как это сделать?

Михаил
Михаил
03/10/2011 19:53

Доброго времени!
Вопрос не совсем по теме, но может быть поможете.
Как преобразовать параметр POST  события OnBeforeNavigate в читабельный вид?  

Руслан Ишкуватов

а можно изменить код страницы в контакте

user
user
12/08/2012 01:41

Хорошая статья. Но есть вопрос. Как получить следующий елемент? Вот допустим такой документ:

….
1-ый стоим здесь
.. много вложенных в блоке елементов

2-ой нужно сюда

Как, находясь на 1-ом диве, перейти на второй не перебирая при этом всю вложенную коллекцию 1-ого.

Вопрос не об том, как получить коллекцию тега div(getElementsByName) и ее перебрать, а как перейти на следующий елемент без перебора вложенных тегов.

trackback

[…] с Word в Delphiработа с excel delphidelphi internetисходникикак изменить код страницыxe2Голосовой движок Дмитрийdelphi код символаdelphi […]

chester
chester
04/12/2012 15:19

Сорри, если не вовсе в тему, может кто знает как решить проблему с использованием возможностей на делфи Internet Explorer 10, по идее какая версия IE установлена то и используется в делфи, но почему то те сайты которые отлично стали работать после установки на IE10, через мою прогу которая запускает этот сайт через webbrowser не корректно отображает, хотя сайтами браузер распознается как версия браузера Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0), но он не работает как сам IE10, даже при вводе в форме нет тех мини кнопок для удобства очистки или показа пароля под звездочками.

chester
chester
04/12/2012 16:51

Спасибо Влад, попробую там, компонентам chrome я пользовался, по началу все получалось, но потом зашел в тупик когда надо было делать разные манипуляции над страницей, и получением нужных идентификаторов, то что недостаточно открыто расписана документация по нем и не все найдешь в инете, а на webbrowser вроде любая проблема решима, просто нужна поддержка новых стандартов, что IE10 и дает, я вот еще думал установить windows 8 там по умолчанию уже IE10 стоит, но хочу подождать официального выхода.

Лилия
Лилия
26/08/2013 16:22

Здравствуйте!
Я сделала меню боковое из картинок и обложку картинку. Когда щелкаешь на картинку меню должно на месте обложки открываться HTML-страница. Я сделала как у вас написано, но для того что бы работал WebBrowser1 я его растянула поверх картинки и получается он ее закрывает. Как можно сделать что бы была обложка, а потом при нажатии на меню(картинку) появлялась HTML-страница?

Лилия
Лилия
26/08/2013 23:57

Нажимала но WebBrowser1 не уходит на задний план и на оборот. Но ведь мне кроме того что убрать надо что бы при щелчке WebBrowser1 вышел на передний план. Возможно надо прописать какой-то код?

Fatalist
Fatalist
22/11/2013 14:49

Здравствуйте! Как не ищу какой нибудь урок попадаю на ваш сайт) не могли бы подсказать как отобразить только мне нужную часть странички? ну я не холел бы видеть боковое меню и всякую рекламу… подскажите как все это реализовать?

Fatalist
Fatalist
29/11/2013 23:14
Ответить на  Vlad

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

Fatalist
Fatalist
01/12/2013 00:42
Ответить на  Vlad

Влад, Можно ваши контактные данные? Ну маил или icq есть парочку вопросов) не хотел бы писать тут….

mrprogmaster
mrprogmaster
23/01/2014 18:23

Vlad, мой скайп mr.progmaster напишите пожалуйста. Есть вопросы)

mrprogmaster
mrprogmaster
30/01/2014 16:22

https://www.partslink24.com/pl24-parts/fiat/parts/start.do?service=alfa_parts — есть страничка, как в ней убрать меню «Корзина»?