QWebEngineView显示页面仅在javascript脚本完成后

时间:2019-06-05 17:29:53

标签: javascript c++ qt qwebengineview

我正在使用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,而waitForKeyElementthis,基本上等待页面元素出现在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";
}

基本上,当类.x-live-elements的元素出现在DOM中时,使用回调将其向下滚动页面并将表和整个主体的背景设置为透明。这是可行的,但我想一直隐藏页面,直到完成为止,现在用户可以看到作业正在运行一会儿。首先,我为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指令),这意味着工作已完成,因此该函数应返回并调用runJavascript的回调..但不起作用。它永远卡在while循环中,永远不会返回,如果条件永远不会满足。 我知道runJavascript不是同步的,并且当javascript文件到达末尾时会立即触发回调,但是使用while循环时,我应该克服这一点。 有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

我能做到的最好的是:

在运行jquery和waitForKeyElement之前,我将整个身体隐藏起来

ui->webView->page()->runJavaScript("$('body').hide();");
ui->webView->page()->runJavaScript(jQuery);
ui->webView->page()->runJavaScript(waitForKeyElement);

然后在waitForKeyElement.js中,我的滚动页面功能变为:

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);
}

这不是诅咒,不是最好的解决方案,但对我来说是可以接受的。