在 .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 保存,然后在我确实想断开连接时使用它().
我正在使用 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 保存,然后在我确实想断开连接时使用它().