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

How can I inject JavaScript file into a WebEngineView page?

我在 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 不知何故坏了。有谁知道如何解决这个问题?

问题与 QML 的异步性质有关,JavaScript。

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

但我相信在我的去冲突函数被调用之前,webview 还没有完成对插入的 jQuery 库的解析,所以它失败了。 (我对浏览器编程不是很有经验,或者我可能从一开始就怀疑这一点。)

解决方案是插入一个带有一小段 JavaScript 的脚本标记,插入 jQuery 然后设置超时等待 200 毫秒,然后再调用消除冲突函数。像这样:

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()

它工作可靠,对我来说是可以接受的。