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