我需要在html中突出显示一些span元素并显示一个弹出窗口。以下代码执行突出显示,但进入和离开事件在短暂使用后停止工作(可能20次进入和离开)。如果我添加弹出窗口,事件将会更快地停止工作 - 通常只需要拨打一两个电话。我不知道如何调试它,因为没有异常,事件就停止被调用。
我从文档中编写了这段代码,因为我找不到任何人使用像这样的元素事件处理程序:HTMLElementEvents2_onmouseenterEventHandler
请注意,此代码需要“使用mshtml;”以及对COM'Microsoft HTML对象库'
的引用 void mBrowser_LoadCompleted(object sender, EventArgs e)
{
Debug.WriteLine("LoadCompleted");
var doc = (IHTMLDocument2)mBrowser.Document;
foreach (IHTMLElement elem in doc.all)
{
if (elem.tagName == "SPAN")
{
mshtml.HTMLElementEvents2_Event iEvt;
iEvt = (HTMLElementEvents2_Event)elem;
iEvt.onmouseenter += new HTMLElementEvents2_onmouseenterEventHandler(onMouseEnter);
iEvt.onmouseleave += new HTMLElementEvents2_onmouseleaveEventHandler(onMouseLeave);
//iEvt.onmouseover += new HTMLElementEvents2_onmouseoverEventHandler(onMouseOver);
Debug.WriteLine("span: " + elem.innerHTML);
}
}
}
void onMouseEnter(mshtml.IHTMLEventObj e)
{
Debug.WriteLine(" mouse enter! " + e.srcElement.innerHTML);
//mPopup.IsOpen = true;
//mPopup.HorizontalOffset = e.x;
//mPopup.VerticalOffset = e.y;
e.srcElement.style.backgroundColor = "#CCCCCC";
}
void onMouseLeave(mshtml.IHTMLEventObj e)
{
//mPopup.IsOpen = false;
Debug.WriteLine(" mouse leave! " + e.srcElement.innerHTML);
e.srcElement.style.backgroundColor = "#FFFFFF";
}
答案 0 :(得分:1)
您需要将元素事件保留在静态字段上以避免垃圾回收。
static mshtml.HTMLElementEvents2_Event iEvt;
答案 1 :(得分:0)
您需要保留元素事件列表以避免垃圾回收。
List<mshtml.HTMLElementEvents2_Event> mEvts = new List<HTMLElementEvents2_Event>();
和
mEvts.Add(iEvt);