2

我想处理 ommouseenter 事件,但从未从 TWebBrowser 调用事件。虽然我成功地捕捉到了 onmousemove 事件。当前浏览器 IE9。我的代码:

var
  D3: IHTMLDocument3;
begin

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

3 回答 3

4

我怀疑原因是ommouseenter 事件没有冒泡。IOW 它仅在鼠标指针移到您将事件附加到的元素上时触发。因此,您不能使用一个“通用”事件处理程序,您必须附加到您插入的每个元素。

于 2011-07-28T11:31:02.077 回答
2

您必须将事件处理程序附加到每个感兴趣的元素。如果您对所有元素感兴趣,那么您必须遍历所有元素:

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并在那里附加处理程序

我也希望它和你的方法一样简单。这将为我们省去很多麻烦。

于 2011-07-28T15:55:06.783 回答
1

正如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;
于 2011-07-28T16:06:29.230 回答