Устранение проблемы с событием onmouseenter в TWebBrowser для Internet Explorer 9
Иногда разработчики сталкиваются с трудностями при работе с компонентом TWebBrowser в среде Delphi, особенно когда дело касается событий, связанных с пользовательскими действиями, такими как перемещение курсора мыши. В данной статье мы рассмотрим, как можно решить проблему с невызовом события onmouseenter в TWebBrowser для браузера Internet Explorer 9.
Описание проблемы
Пользователь столкнулся с ситуацией, когда событие onmouseenter не вызывается в компоненте TWebBrowser при использовании Internet Explorer 9. Несмотря на то что событие onmousemove успешно обрабатывается, onmouseenter остается неактивным. В коде, предоставленном пользователем, создается объект TEventObject для обработки события, но оно так и не происходит.
var
D3: IHTMLDocument3;
begin
if Supports(WebBrowser1.Document, IHTMLDocument3, D3) then
begin
eo1 := TEventObject.Create(self.EventHadler);
D3.attachEvent('onmouseenter', eo1);
end;
end;
Альтернативный ответ
В комментариях к вопросу предложено использовать компонент TEmbeddedWB от www.bsalsa.com, который может быть более функциональным и удобным для работы с событиями.
Также было замечено, что событие ommouseenter не образует "пузырька", то есть оно не будет вызвано, если курсор мыши перемещается над дочерними элементами объекта, к которому привязано событие. Это означает, что необходимо привязывать обработчик событий к каждому интересующему элементу.
Подтвержденный ответ
Для решения проблемы необходимо привязать обработчик событий ко всем интересующим элементам. Если требуется обработать события для всех элементов, следует пройти по списку всех элементов и привязать к каждому из них обработчик событий:
var
All: IHTMLElementCollection;
Element2: IHTMLElement2;
i: Integer;
begin
Handler:= TEventObject.Create(Self.EventHandler);
All:=(WebBrowser1.ControlInterface.Document as IHTMLDocument2).All;
for i:=0 to All.Length-1 do
begin
Element2:=All.item(i,EmptyParam) as IHTMLElement2;
Element2.AttachEvent('onmouseenter', Handler);
end;
end;
Лучше всего привязывать обработчик событий после получения события DocumentComplete для интересующего документа и отвязывать его в событии BeforeNavigate.
Важные моменты, о которых следует помнить:
Документ может не завершить загрузку, что приведет к тому, что обработчики событий не будут привязаны (например, из-за фреймов с рекламой).
Скрипты могут модифицировать страницу, добавляя новые элементы, к которым не будет привязан обработчик событий.
Необходимо вручную обработать FRAMEs и IFRAMEs.
Альтернативное решение
Согласно информации с MSDN, onmouseenter не образует "пузырька", но можно использовать событие onmouseover, которое также будет вызываться, когда курсор мыши перемещается над объектом, и не будет повторяться, пока курсор находится вне объекта.
Пример кода на Object Pascal для обработки события onmouseover:
procedure MyEvent;
var
Doc: OleVariant;
begin
Doc := Form1.WebBrowser1.Document;
Form1.Label1.Caption := Doc.parentWindow.event.srcElement.outerHTML;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
D3: IHTMLDocument3;
begin
if Supports(WebBrowser1.Document, IHTMLDocument3, D3) then
D3.attachEvent('onmouseover', TEventObject.Create(MyEvent) as IDispatch);
end;
Используя данный подход, можно успешно обработать события, связанные с перемещением курсора мыши над элементами в TWebBrowser, даже при использовании Internet Explorer 9.
Разработчик столкнулся с проблемой невызова события `onmouseenter` в компоненте `TWebBrowser` для Internet Explorer 9 и нашел решение в привязке обработчика ко всем интересующим элементам после получения события `DocumentComplete`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.