我将网页标记在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在某种程度上被打破了。有谁知道如何解决这个问题?
答案 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()
它可靠地工作,并且可以接受我的目的。