0

我需要在我的 html 中突出显示一些 span 元素并显示一个弹出窗口。以下代码进行了突出显示,但进入和离开事件在使用短时间后停止工作(可能 20 次进入和离开)。如果我添加弹出窗口,事件将很快停止工作 - 通常只需要一两个电话。我不知道如何调试它,因为没有例外,事件只是停止被调用。

我从文档中编写了这段代码,因为我找不到任何人使用这样的元素事件处理程序:HTMLElementEvents2_onmouseenterEventHandler

请注意,此代码需要“使用 mshtml;” 以及对 COM 'Microsoft HTML object library' 的引用

 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";
    }
4

2 回答 2

1

您需要将元素事件保留在静态字段上以避免垃圾收集。

static mshtml.HTMLElementEvents2_Event iEvt;
于 2015-08-22T09:20:31.980 回答
0

您需要保留元素事件列表以避免垃圾收集。

List<mshtml.HTMLElementEvents2_Event> mEvts = new List<HTMLElementEvents2_Event>();

mEvts.Add(iEvt);
于 2013-04-28T17:05:24.993 回答