QWebEngineView 仅在 javascript 脚本完成后显示页面
QWebEngineView show page only upon javascript script finish
我正在开发带有 Web 视图的 C++ Qt 应用程序。
这就是我想要做的:我想显示一个网页(我无法控制它,所以我无法修改它但我确定这个页面的作用,所以不要担心意外行为) 给用户,但只有在 运行 之后一些 javascript 就可以了。
问题是我无法等待 javascript。
我使用 Qt、QWebEngineView 加载页面并使用以下方法在其上注入 javascript 文件:
void MainWindow::pageloaded(bool ok)
{
ui->webView->page()->runJavaScript(jQuery);
ui->webView->page()->runJavaScript(waitForKeyElement,[this](const QVariant &v) { qDebug() << v.toString();ui->webView->show();});
}
jquery
只是文件 jquery.min.js
而 waitForKeyElement
是 this 并且基本上等待页面元素出现在 DOM 中。
在后一个文件的末尾,我附加了我的函数:
waitForKeyElements (".x-live-elements", scrollpage);
function scrollpage (jNode) {
window.scrollTo(0, 80);
tables = document.getElementsByClassName("x-content");
table = tables[0];
table.style.backgroundColor="transparent";
document.body.style.backgroundColor = "transparent";
}
基本上当 class .x-live-elements
的元素出现在 DOM 中时,使用回调它向下滚动页面并设置 table 和整个背景body 到透明。这是有效的,但我想在完成之前隐藏该页面,现在用户可以暂时看到作业 运行。一开始我为webview调用方法hide()
,但是当javascript完成后如何调用show()
?
我的想法是在 waitForKeyElement.js
文件的末尾添加:
(function (){
while(true){
var bodyStyle = window.getComputedStyle(document.body, null);
var bgcolor = bodyStyle.backgroundColor;
var transparent = 'rgba(0, 0, 0, 0)';
if (bgcolor === transparent){
break;
}
}
a = "done";
return a;
})();
当页面背景变透明时(这基本上是我需要的最后一条javascript指令)意味着工作完成,所以函数应该return并调用runJavascript的回调.. 但它不起作用。它永远陷入 while 循环,永远不会 return,永远不会满足 if 条件。
我知道 runJavascript 不是同步的,并且 javascript 文件到达末尾时会立即触发回调,但是使用 while 循环我应该克服这个问题..
有什么帮助吗?
我能做到的最好的是:
在运行jquery和waitForKeyElement之前我隐藏了整个body
ui->webView->page()->runJavaScript("$('body').hide();");
ui->webView->page()->runJavaScript(jQuery);
ui->webView->page()->runJavaScript(waitForKeyElement);
然后在 waitForKeyElement.js 我的 scrollpage 函数变成了:
function scrollpage (jNode) {
tables = document.getElementsByClassName("x-content");
table = tables[0];
table.style.backgroundColor="transparent";
document.body.style.backgroundColor = "transparent";
$('body').show();
window.scrollTo(0, 80);
}
当然这不是最好的解决方案,但对于我的目的来说是可以接受的。
我正在开发带有 Web 视图的 C++ Qt 应用程序。 这就是我想要做的:我想显示一个网页(我无法控制它,所以我无法修改它但我确定这个页面的作用,所以不要担心意外行为) 给用户,但只有在 运行 之后一些 javascript 就可以了。 问题是我无法等待 javascript。 我使用 Qt、QWebEngineView 加载页面并使用以下方法在其上注入 javascript 文件:
void MainWindow::pageloaded(bool ok)
{
ui->webView->page()->runJavaScript(jQuery);
ui->webView->page()->runJavaScript(waitForKeyElement,[this](const QVariant &v) { qDebug() << v.toString();ui->webView->show();});
}
jquery
只是文件 jquery.min.js
而 waitForKeyElement
是 this 并且基本上等待页面元素出现在 DOM 中。
在后一个文件的末尾,我附加了我的函数:
waitForKeyElements (".x-live-elements", scrollpage);
function scrollpage (jNode) {
window.scrollTo(0, 80);
tables = document.getElementsByClassName("x-content");
table = tables[0];
table.style.backgroundColor="transparent";
document.body.style.backgroundColor = "transparent";
}
基本上当 class .x-live-elements
的元素出现在 DOM 中时,使用回调它向下滚动页面并设置 table 和整个背景body 到透明。这是有效的,但我想在完成之前隐藏该页面,现在用户可以暂时看到作业 运行。一开始我为webview调用方法hide()
,但是当javascript完成后如何调用show()
?
我的想法是在 waitForKeyElement.js
文件的末尾添加:
(function (){
while(true){
var bodyStyle = window.getComputedStyle(document.body, null);
var bgcolor = bodyStyle.backgroundColor;
var transparent = 'rgba(0, 0, 0, 0)';
if (bgcolor === transparent){
break;
}
}
a = "done";
return a;
})();
当页面背景变透明时(这基本上是我需要的最后一条javascript指令)意味着工作完成,所以函数应该return并调用runJavascript的回调.. 但它不起作用。它永远陷入 while 循环,永远不会 return,永远不会满足 if 条件。 我知道 runJavascript 不是同步的,并且 javascript 文件到达末尾时会立即触发回调,但是使用 while 循环我应该克服这个问题.. 有什么帮助吗?
我能做到的最好的是:
在运行jquery和waitForKeyElement之前我隐藏了整个body
ui->webView->page()->runJavaScript("$('body').hide();");
ui->webView->page()->runJavaScript(jQuery);
ui->webView->page()->runJavaScript(waitForKeyElement);
然后在 waitForKeyElement.js 我的 scrollpage 函数变成了:
function scrollpage (jNode) {
tables = document.getElementsByClassName("x-content");
table = tables[0];
table.style.backgroundColor="transparent";
document.body.style.backgroundColor = "transparent";
$('body').show();
window.scrollTo(0, 80);
}
当然这不是最好的解决方案,但对于我的目的来说是可以接受的。