如何将JavaScript文件注入WebEngineView页面?

时间:2015-06-29 21:27:06

标签: qt qml qtquick2 qtquickcontrols qtwebengine

我将网页标记在WebEngineView中完全加载后添加到网页中,但它会以某种方式无声地失败。

我通过使用以下代码调用webview.runJavaScript来注入脚本:

var s = document.createElement('script');
s.src = "qrc:/jquery-2.1.4.min.js";
document.body.appendChild(s);

这是完全标准的,并且在某种程度上它按预期工作,即,如果我查看页面的html来源,脚本标记确实已附加到正文中。

问题是脚本没有被下载,或者没有被评估,或者是什么。我所知道的只是上面的例子,jQuery函数是不可用的。如果我用一个全局变量加载一个小的JavaScript测试文件,那么该变量也不可用。将URL更改为http而不是qrc并将其指向Web服务器没有任何区别。

注入img代码效果很好;加载并显示图像。

但JavaScript在某种程度上被打破了。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题与QML和JavaScript的异步特性有关。

我正在插入一个脚本标记来注入jQuery,然后我调用了一个函数来解决jQuery的插入版本与任何版本的jQuery可能已经在原始页面中的冲突。

但我相信在我的de-conflicting函数被调用之前,webview还没有完成解析插入的jQuery库,所以它失败了。 (我对浏览器编程不是很熟悉,或者我从一开始就怀疑这个。)

解决方案是插入带有一小部分JavaScript的脚本标记,该标记插入jQuery,然后在调用de-conflict函数之前设置等待200ms的超时。像这样:

function insertAuhJQuery(){
var s = document.createElement("script");
s.src = "qrc:/jquery-2.1.4.min.js";
document.body.appendChild(s);
window.setTimeout(deConflictJQuery, 200);
}

function deConflictJQuery(){
auh = {};
auh.$ = jQuery.noConflict(true);
}

insertAuhJQuery()

它可靠地工作,并且可以接受我的目的。