WebView2 - 如何从 BLOB URL 读取数据?
WebView2 - How to read data from BLOB URL?
如何从 WebView2 中的 BLOB Url 读取数据作为文本?我已尝试从 Javascript 进行 WebView2 回调,但我无法使其正常工作。我很欣赏它是否是 Javascript 解决方案,但我更喜欢 C++。
WebView2 不提供与 Blob 交互的机制。你可以 turn the Blob into text in script and then post the text back to the native side with the window.chrome.webview.postMessage
method and the WebMessageReceived event.
如果这对您不起作用,您可以在 WebView2 Feedback GitHub Project 上提出功能请求。
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();
遗憾的是,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 代码的方式,将文本发回本机端可能是一个更好的主意,正如@David Risney 所建议的那样。
如何从 WebView2 中的 BLOB Url 读取数据作为文本?我已尝试从 Javascript 进行 WebView2 回调,但我无法使其正常工作。我很欣赏它是否是 Javascript 解决方案,但我更喜欢 C++。
WebView2 不提供与 Blob 交互的机制。你可以 turn the Blob into text in script and then post the text back to the native side with the window.chrome.webview.postMessage
method and the WebMessageReceived event.
如果这对您不起作用,您可以在 WebView2 Feedback GitHub Project 上提出功能请求。
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();
遗憾的是,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 代码的方式,将文本发回本机端可能是一个更好的主意,正如@David Risney 所建议的那样。