为什么从未在TWebBrowser中调用ommouseenter事件(IE9已安装)

时间:2011-07-28 11:14:25

标签: delphi internet-explorer-9 twebbrowser

我想处理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;

3 个答案:

答案 0 :(得分:4)

我认为原因是ommouseenter event没有泡沫。 IOW它仅在鼠标指针移动到您附加事件的元素上时触发。因此,您不能使用一个“通用”事件处理程序,您必须附加到您所拥有的每个元素。

答案 1 :(得分: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并在那里附加处理程序

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

答案 2 :(得分: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;