Довольно часто при разработке программ для Веб используется компонент WebBrowser, расположенный на странице палитры компонентов Internet. Этот компонент помогает легко встроить веб-браузер в Ваше приложение и использовать все функциональные возможности IE в своих приложениях.
При этом может возникнуть необходимость обратить внимание пользователя на какой-либо элемент, загруженной в WebBrowser страницы, например на ссылку или изображение. Выводить все ссылки в отдельный список? Не эффективно и может потребовать лишнего места на форме для расположения визуальных компонентов. Более эффективно каким-либо образом изменить html-код страницы, например выделить ссылки полужирным шрифтом или вставить рядом со ссылкой небольшое изображение. Как это делается — рассмотрим на небольшом примере.
1. Теория
В статье «Что можно «вытащить» из DOMа» мы немного касались таких свойств объекта Document как innerText и outerText. Аналогично этим, есть ещё два свойства: innerHTML и outerHTML. Чтобы понять какую информацию несут в себе эти свойства посмотрите на следующий рисунок:
В представленном на рисунке фрагменте кода рассмотрены свойства innerHTML/innerText и outerHTML/outerText для элемента страницы «параграф».
Теперь, используя эти свойства Вы сможете всегда найти на странице необходимый элемент и работать с ним.
Что касается вставки своего кода в загруженную страницу, то для этого можно использовать два метода:
- insertAdjacentText(where, text: string);
- insertAdjacentHTML(where, html: string).
Эти методы очень похожи друг на друга. Единственное различие в них состоит в том, что insertAdjacentHTML позволяет вставить в страницу текст, содержащий html-теги и эти теги будут правильно интерпретированы браузером.
Для того, чтобы воспользоваться этими методами необходимо задать два параметра: where — строка, указывающая в каком месе следует вставить элемент text/html. При этом where может принимать следующие значения:
afterBegin — вставляет строку text/html после открывающего тега элемента;
beforeBegin — вставляет строку text/html перед открывающим тегом элемента;
afterEnd — вставляет строку text/html после закрывающего тега элемента;
beforeEnd — вставляет строку text/html перед закрывающим тегом элемента;
Теперь рассмотрим все вышесказанное на небольшом примере.
2. Практическая часть
Давайте напишем небольшое приложение, которое будет каким-либо образом отмечать на загруженной странице все ссылки.
Открываем Delphi, создаем новый проект и в главном модуле не забываем подключить в uses модуль MSHTML.
Я не стал сильно «выделываться» в плане интерфейса и сделал вот такую форму приложения:
В верхнее поле вводим адрес сайта, жмем «Перейти» и после загрузки страницы начинаем «колдовать» над кодом страницы.
При этом с помощью двух 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, вставив рядом с ней необходимый текст. Работающая программа выглядит вот так:
Аналогичным образом можно вставлять в код страницы, например, небольшие изображения или вообще полностью изменить все рисунки на страницы — никто Вас не ограничивает :)
Если есть вопросы — прошу задавать.
спасибо интересненькая довольно таки статья, но вопрос как загрузить только определенную элементы? Тоесть при загрузке удалить лишние элементы?
Видимо следует анализировать HTTP-траффик :) Никогда не задавался такой целью как загрузка части содержимого страницы, но начал бы с HTTP-заголовков
ВЛАД, отличный материал… столкнулся с проблемой…
я делаю полуавтоматический постинг на форуме…
хочу вытащить поле <input и туда вставить заготовленую тему ..и вытащить …тело сообщение и туда вставить мое сообщение…
чтобы мне нужно было только на сайте нажать кнопку отправить…а поля авотматически заполнялись..
Как мне вытащить поля для ввода и добавить туда мой текст?
Если делается программа под конкретный форум, то по-моему удобнее было бы организовать работу через GET- POST-запросы, чем ковыряться в HTML-коде. А вообще вставить текст в поле ввода можно как рассказано здесь. Это пост из старого моего блога. Текст немного покорежен, но разобраться можно :)
у меня есть более эффективный способ и лёгкий изменить исходный текст))))
memo1.keyup(чтото там);
begin
webbrowser1.oleobject.document.body.innerhtml := memo1.text;
end;
можно также наоборот брать сорс в мемо
у меня есть проблема с webbrowser!!!!
предложите способ отправки файла скрипту на сервере
через put или пост, плиииииииз очень нада
именно с использованием webbrowser! через indy я и так знаю….
Доброе время суток. Вопрос Автору. Можно ли привести пример со скачиваемым исходником программы, следующего функционала: 1)загружает страницу 2)находит нужную мне форму 3) Заполняет нужным мне текстом нужную форму. БУДУ ПРИМНОГО БЛАГОДАРЕН ЕСЛИ ПОМОЖЕТЕ В РЕШЕНИИ ДАННОЙ ЗАДАЧИ.
Давно все написано.
Вопрос возможно не по теме.
Я пытаюсь написать GPS трекер.
Использую Delphi+google map api.
Использую компонент webbrowser.
Нарисовать карту с гугла проблем нет, нарисовать на ней линией маршрут тоже не проблема. Проблема заключается в рисовании маршрута в режиме реального времени.
На гугле есть готовые скрипты java, но вот как заставить их работать на уже открытой html странице пока не пойму. Сейчас я просто изменяю текст html страницы и заново даю комманду WebBrowser1.Navigate(Text); что естественно занимает время, а также создает неудобства при работе с программой.
Можете подсказать путь более правильной работы с этой связкой.
Заранее благодарю.
Акмал.
У меня к вам такой вопрос. при загрузки страницы мне надо изменить ее код, то есть не просто вставить что то дополнительное, а в какой то части кода изменить. как это сделать?
Andrey, в принципе можно сделать так: качаете исходник страницы, например с помощью Synapse, изменяете его как вам надо и загружаете в TWebBrowser. Информации о том как закинуть в TWebBrowser страничку из string — в сети вагон. Кстати, THTTPSend из Synapse может фильтровать скачиваемые данные «на лету» — достаточно определить обработчик события у сокета
Доброго времени!
Вопрос не совсем по теме, но может быть поможете.
Как преобразовать параметр POST события OnBeforeNavigate в читабельный вид?
Михаил, UTF8ToString, UTF8ToAnsi, TEncoding.Convert() — выбирайте любой вариант
а можно изменить код страницы в контакте
Руслан Ишкуватов, да без разницы — хоть в фэйсбуке :) Вы же при этом не сайт хакаете, а просто выводите в браузере измененный код страницы. Главное разобраться, что и куда в этом коде нужно подставлять
Хорошая статья. Но есть вопрос. Как получить следующий елемент? Вот допустим такой документ:
….
1-ый стоим здесь
.. много вложенных в блоке елементов
2-ой нужно сюда
…
Как, находясь на 1-ом диве, перейти на второй не перебирая при этом всю вложенную коллекцию 1-ого.
Вопрос не об том, как получить коллекцию тега div(getElementsByName) и ее перебрать, а как перейти на следующий елемент без перебора вложенных тегов.
[…] с Word в Delphiработа с excel delphidelphi internetисходникикак изменить код страницыxe2Голосовой движок Дмитрийdelphi код символаdelphi […]
Сорри, если не вовсе в тему, может кто знает как решить проблему с использованием возможностей на делфи Internet Explorer 10, по идее какая версия IE установлена то и используется в делфи, но почему то те сайты которые отлично стали работать после установки на IE10, через мою прогу которая запускает этот сайт через webbrowser не корректно отображает, хотя сайтами браузер распознается как версия браузера Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0), но он не работает как сам IE10, даже при вводе в форме нет тех мини кнопок для удобства очистки или показа пароля под звездочками.
chester, с таким вопросом, думаю, лучше будет обратиться в эту ветку форума и расписать все, привести скрины, если надо — больше шансов, что получите ответ. Сам я только Chrome использую в последнее время :)
Спасибо Влад, попробую там, компонентам chrome я пользовался, по началу все получалось, но потом зашел в тупик когда надо было делать разные манипуляции над страницей, и получением нужных идентификаторов, то что недостаточно открыто расписана документация по нем и не все найдешь в инете, а на webbrowser вроде любая проблема решима, просто нужна поддержка новых стандартов, что IE10 и дает, я вот еще думал установить windows 8 там по умолчанию уже IE10 стоит, но хочу подождать официального выхода.
Здравствуйте!
Я сделала меню боковое из картинок и обложку картинку. Когда щелкаешь на картинку меню должно на месте обложки открываться HTML-страница. Я сделала как у вас написано, но для того что бы работал WebBrowser1 я его растянула поверх картинки и получается он ее закрывает. Как можно сделать что бы была обложка, а потом при нажатии на меню(картинку) появлялась HTML-страница?
Лилия, использовать методы BringToFront и SendToBack компонентов, видимо?
Нажимала но WebBrowser1 не уходит на задний план и на оборот. Но ведь мне кроме того что убрать надо что бы при щелчке WebBrowser1 вышел на передний план. Возможно надо прописать какой-то код?
Здравствуйте! Как не ищу какой нибудь урок попадаю на ваш сайт) не могли бы подсказать как отобразить только мне нужную часть странички? ну я не холел бы видеть боковое меню и всякую рекламу… подскажите как все это реализовать?
Я бы делал так:
1. Скачиваю страничку
2. Ищу с помощью регулярного выражения нужную мне часть HTML-кода и копирую её в какую-нибудь переменную, например, типа string
3. Добавляю в полученный текст необходимые теги, например, body, html и т.д…в общем, чтобы получить нормальные HTML-документ
4. Вывожу сей документ в TWebBrowser
Спасибо за ответ) А пример можно? или вот у меня идея, например сохранить полный исходный код странички и потом удалить все то что мне не нужно и спокойно смотреть не вариант? Скрипты только правельно подключить и все?
отчего же не вариант? Только потом надо будет правильно загрузить очищенный текст в TWebBrowser для отображения. В свое время использовал примерно такой код для получения DOM из строки текста:
var Doc: IHTMLDocument2; //экземпляр документа
procedure GetDom(const URL: string; idHTTP: TIdHTTP);
var Cache: string;
V: OleVariant;
begin
Cache:=IdHTTP.Get(url);
Doc:=coHTMLDocument.Create as IHTMLDocument2; //создали экземпляр документа
V:=VarArrayCreate([0,0], varVariant);
V[0]:=Cache;
Doc.Write(PSafeArray(TVarData(v).VArray)); //записали полученные данные
end;
У TWebBrowser можно запросить интерфейс IHTMLDocument2 и воспользоваться приведенной выше процедурой (ну, естественно модифицированной под свои нужды) и будет вам счастье — увидите очищенную от мусора страничку.
Влад, Можно ваши контактные данные? Ну маил или icq есть парочку вопросов) не хотел бы писать тут….
я обычно в скайпе сижу- vlad55ru
Vlad, мой скайп mr.progmaster напишите пожалуйста. Есть вопросы)
https://www.partslink24.com/pl24-parts/fiat/parts/start.do?service=alfa_parts — есть страничка, как в ней убрать меню «Корзина»?