【问题标题】:How can you add mutation observer to a WebView2 control如何将突变观察者添加到 WebView2 控件
【发布时间】:2020-11-12 19:17:30
【问题描述】:

我正在构建一个使用 WebView2 控件的 WinForms 应用程序 有没有办法通过突变观察者注入一些 JavaScript 以在 ajax 调用后获取 div 的内容?

我认为这可以使用 WebVeiw 中的 ScriptNotify 来完成

我的问题是我可以注入一个脚本,但在 JavaScript 完成之前控件会返回给 WinForms

C#

        private async void webView21_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
    {
        StatusLabel.Text = "Page loaded";
       string Script = File.ReadAllText(@"D:\Vb\Test\WebView2ControlWinForms\TestScript.js");

        await webView21.CoreWebView2.ExecuteScriptAsync(Script);

        // Stop here until last line finishesd;
        string res = await webView21.CoreWebView2.ExecuteScriptAsync(@"document.getElementById('res').innerHTML");
        var htmldecoded = System.Web.Helpers.Json.Decode(res);
        richTextBox1.Text = htmldecoded;
    }

JavaScript

// JavaScript source code
var results = [];
let target = document.querySelector('.getblock')
let config = { childList: true }
let observer = new MutationObserver(function (mutationList, observer) {
    console.log("CONTENT CHANGED!")
    console.log(mutationList)
    console.log(observer)
    for (const mutation of mutationList) {
        if (mutation.type === 'childList') {
            console.log('A child node has been added or removed.');
            results.push(mutation);
        }
        else if (mutation.type === 'attributes') {
            console.log('The ' + mutation.attributeName + ' attribute was modified.');
        }
    }
    //json = JSON.stringify(results);
    //returnFunc(json);

    GetLinks();
    
})

observer.observe(target, config)

var el = document.querySelectorAll('.getblock span');
//var el = document.querySelectorAll('button');
var i;
alert("el is " + el.length + " Long");
for (i = 0; i < el.length; i++) {
    // alert("Click "+ i);
    el[i].click();
}

function GetLinks() {
    alert("Hello from GetLinks ")
    var el = document.querySelectorAll('.getblock  a');
    alert("Hello from GetLinks " + el.length);
    var i;
    var json;
    for (i = 0; i < el.length; i++) {
        results.push(el[i].href);
        json = JSON.stringify(results);
    }
    returnFunc(json);
}

function returnFunc(json) {
    var ele = document.getElementById('res');
    if (ele !== null) {
        ele.innerHTML = json
    } else {
        var div = document.createElement('div');
        div.id = 'res';
        div.innerHTML = json
        document.body.appendChild(div);
    }
}

【问题讨论】:

    标签: javascript c# winforms webview2


    【解决方案1】:

    在 ExecuteScriptAsync 调用上调用 await 将等待同步全局脚本执行或引发未处理的异常。因此,ExecuteScriptAsync 不会等待任何异步 JavaScript 代码,例如来自 setTimeout、promise 或 MutationObserver 的回调。或者如果有任何未处理的异常,它将停止执行注入的脚本。

    如果您需要了解异步 JavaScript 代码完成,您可以在脚本完成后使用 CoreWebView2.WebMessageReceivedchrome.webview.postMessage 将消息从您的脚本发送到您的本机代码。

    如果您想在未处理的异常情况下获得详细的错误信息,您可以将注入的代码包装在 try/catch 块中并检查任何未处理的异常。

    【讨论】:

    • 你是说用 chrome.webview.postMessage 发送/注入 JavaScript 代码,当它完成时会触发 CoreWebView2.WebMessageReceived?除了基本的gettingstarted 之外,是否有任何教程或示例说明如何做到这一点?
    • 是的,完全正确。在您的本机代码中订阅 WebMessageReceived 事件,然后注入您的脚本。该脚本在任何时候异步或以其他方式调用chrome.webview.postMessage({ completed: true });,您将在WebMessageReceived 中以JSON 形式接收该对象。 WebView2Sample 应用有示例代码github.com/MicrosoftEdge/WebView2Samples/blob/…
    • 我一直在看示例代码 看起来本机代码不是 C# 可能是 C++?使用它作为源代码,你能告诉我它是如何在 C# 中完成的,还是需要一个新线程?
    • 没有其他示例或示例。如果您愿意,可以打开一个新线程。
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2020-01-30
    • 2012-05-20
    • 2013-11-26
    相关资源
    最近更新 更多