在 .NET 中使用 WebBrowser,是否可以使用变异观察器来观察 DIV 变化?

Using a WebBrowser in .NET, can a mutation observer be used to watch for DIV changes?

我正在使用 vb.NET,但我使用 addEventListener 和 DOMSubtreeModified 从此处合并了一个 C# 示例以观看整个 DOM 文档:

    Dim script As HtmlElement = Me.Browser.Document.CreateElement("script")
    script.InnerHtml = "function listenToDOM() { document.addEventListener('DOMSubtreeModified', function(e) { window.external.DOMUpdate() }); }"
    Me.Browser.Document.GetElementsByTagName("body")(0).AppendChild(script)
    Me.Browser.Document.InvokeScript("listenToDOM")

...但是,我正在尝试将其分类为更具体的 DIV。我在这方面还没有成功,但我读得越多,我就越觉得我应该使用一个我一无所知的 MutationObserver,尤其是我不知道如何与 WebBrowser 控件结合使用。

有人成功做到了吗?

注意:是的,这是 WinForms WB,我已经将我的 BrowserEmulation 设置为 IE11,所以这应该不是问题。

更新:我尝试了一个实现,但它没有触发:

    Dim scriptEl As HtmlElement = Me.Browser.Document.CreateElement("script")
    scriptEl.InnerHtml = "var targetNode = document.querySelector('.div-content');
        
        var Config = {
            attributes: true, 
            childList: true, 
            characterData: true,
            subtree: true
        };

        function (as Observer = new MutationObserver(function (MutationRecords, MutationObserver) { window.external.DivUpdated(); }); 
    
        Observer.observe(targetNode, Config);"

    Me.Browser.Document.GetElementsByTagName("body")(0).AppendChild(scriptEl)

这是我想出的。当然,我会根据正在捕获的特定更改对其进行更多开发...

Private Sub AddScript(Code As String)

    Dim script As HtmlElement = Me.Browser.Document.CreateElement("script")
    script.InnerHtml = Code
    Me.Browser.Document.GetElementsByTagName("body")(0).AppendChild(script)

End Sub

Public Sub CreateObserver(theQuery As String)

    Dim ScriptEl As String = "var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            window.external.DIVUpdated(mutation.type);
        });    
    });

    //everything
    var observerConfig = {
        attributes: true,
        subtree: true,
        childList: true, 
        characterData: true 
    };

    var targetNode = document.querySelector('" & theQuery & "');
    observer.observe(targetNode, observerConfig);"

    AddScript(ScriptEl)

End Sub

我有多个脚本,所以我制作了一个单独的子脚本来添加每个脚本。因为 DIV 没有立即加载,我不得不稍后附加它(而不是在 DOC 加载事件中)。

因此,从我的表单中,我 运行 CreateObserver('QueryForMyDIVClassOrOtherIdentifier') 并且观察者使用 mutation.type 触发了我的 .NET 函数 DIVUpdated()。在我的例子中,我正在寻找对包含的文本的 characterData 更改。

我仍然应该添加一个 observer.disconnect() 但老实说这并不重要,因为在我的情况下我希望在 session 的生命中观看它。但我在想,如果我 return 观察者 object 具有 CreateObserver 函数,我可以将我的 .net 变量作为 Object 保存,然后在我确实想断开连接时使用它().