0

HTML でいくつかのスパン要素を強調表示し、ポップアップを表示する必要があります。次のコードは強調表示を行いますが、enter イベントと leave イベントは、短時間使用すると機能しなくなります (おそらく 20 回の入場と退場)。ポップアップを追加すると、イベントはすぐに機能しなくなります - 通常は 1 回か 2 回の呼び出しの後です。例外がないため、これをデバッグする方法がわかりません。イベントの呼び出しが停止するだけです。

このコードは、次のような要素イベント ハンドラーを使用している人を見つけることができなかったので、ドキュメントから書きました: HTMLElementEvents2_onmouseenterEventHandler

このコードには「using 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

0

ガベージ コレクションを回避するために、要素イベントのリストを保持する必要があります。

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

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