0

如何从 WebView2 中的 BLOB Url 将数据作为文本读取?我已经尝试了来自 Javascript 的 WebView2 回调,但我无法使其工作。我很欣赏它是否是 Javascript 解决方案,但我更喜欢 C++。

4

2 回答 2

1

不幸的是,Webview2 不支持 ExecuteScript 中的异步函数结果。我设法通过使用 ajax 执行同步请求来获取数据。

wstring jquery(L"var jqry = document.createElement('script');"
L"jqry.src = 'https://code.jquery.com/jquery-3.3.1.min.js';"
L"document.getElementsByTagName('head')[0].appendChild(jqry);");
webview->ExecuteScript(jquery.c_str(), Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
    [](HRESULT errorCode, PCWSTR result) -> HRESULT {
    return S_OK;
}).Get());
Sleep(500);

wstring script(L"jQuery.noConflict();"
L"function testAjax() {"
L"var result='';"
L"jQuery.ajax({"
    L"url:document.getElementById('test').href,"
        L"async: false,"
        L"success:function(data) {"
            L"result = data; "
        L"}"
        L"});"
    L"return result;"
L"}"
L"(() => {"
    L"return testAjax()"
L"})();");
webview->ExecuteScript(script.c_str(), Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
    [](HRESULT errorCode, LPCWSTR result) -> HRESULT {
        wprintf(L"%ls\n", result);

    return S_OK;
}).Get());

但是同步调用在执行时会阻塞 Web 代码。不建议这样做,但对我来说没问题。如果您正在寻找另一种不阻止 Web 代码的方式,那么正如@David Risney 所建议的那样,将文本发回本机端可能是一个更好的主意。

于 2020-09-02T07:45:50.033 回答
1

WebView2 不提供与 Blob 交互的机制。您可以将 Blob 转换window.chrome.webview.postMessage为脚本中的文本,然后使用方法和WebMessageReceived 事件将文本发布回本机端。

如果这对您不起作用,您可以在WebView2 反馈 GitHub 项目上提出功能请求。

async function example() {
  function textToBlob(text) {
    return new Blob([text], {type : 'text/plain'});
  }

  async function blobToText(blob) {
    return (new Response(blob)).text();
  }

  const blob = textToBlob("example");
  const text = await blobToText(blob);
  alert(text);
}

example();

于 2020-08-27T17:02:55.867 回答