Почему никогда не вызывается событие ommouseenter в TWebBrowser (IE9 установлен) - PullRequest
2 голосов
/ 28 июля 2011

Я хочу обработать событие ommouseenter, но событие никогда не вызывалось из TWebBrowser.Хотя я успешно поймаю событие на mmousemove.Текущий браузер IE9.Мой код:

var
  D3: IHTMLDocument3;
begin

  if Supports(WebBrowser1.Document, IHTMLDocument3, D3) then
  begin
    eo1 := TEventObject.Create(self.EventHadler);
    D3.attachEvent('onmouseenter', eo1);
  end;
end;

Ответы [ 3 ]

4 голосов
/ 28 июля 2011

Я уверен, что причина в том, что событие ommouseenter не всплывает. IOW срабатывает только тогда, когда указатель мыши перемещается над элементом, к которому вы прикрепили событие. Таким образом, вы не можете использовать один «универсальный» обработчик событий, вам нужно прикрепить к каждому элементу, в который вы ввели.

2 голосов
/ 28 июля 2011

Вы должны прикрепить обработчик событий к каждому интересующему элементу. Если вас интересуют все элементы, то вам нужно пройти через все элементы:

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.

Может быть несколько проблем, хотя вы должны знать:

  • документ может никогда не закончить загрузку (это часто вызывается фреймами, содержащими рекламу, когда какой-либо рекламный сервер не обслуживает, поэтому фрейм предотвращает запуск основного документа DocumentComplete), таким образом, ваши обработчики событий никогда не будут присоединены
  • Сценарии могут изменить страницу и добавить элементы, к которым затем не будет подключен обработчик событий
  • вам нужно вручную зайти в FRAMEs / IFRAMEs и прикрепить туда обработчики

Я также хотел бы, чтобы это было так же просто, как ваш подход. Это избавило бы нас от многих хлопот.

1 голос
/ 28 июля 2011

Как указал ain , onmouseenter не всплывает, но, как говорит MSDN ,

В отличие от события onmouseover, событие onmouseenterне пузырится.Другими словами, событие onmouseenter не срабатывает, когда пользователь наводит указатель мыши на элементы, содержащиеся в объекте, тогда как onmouseover срабатывает.

Таким образом, вы можете использовать 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;
...