我可以通过以下方式访问Chrome App Webview HTML:
webview.executeScript(
{code: 'document.documentElement.innerHTML'},
function(results) {
// results[0] would have the webview's innerHTML.
});
但是我想在Guest中获取全局变量的值,如下所示:
webview.executeScript(
{code: 'window.globalVar'},
function(results) {
// results[0] should have the webview's value of "globalVar".
});
我该怎么做?
答案 0 :(得分:4)
总结所需步骤的答案。
1)您将带有webview.executeScript()
的内容脚本注入嵌入页面。
2)由于页面的真实window
已被隔离,因此您需要一个页面级脚本来访问它。您使用here所述的<script>
标记为其注入。
3)页面级脚本可以访问window
对象,但无法与应用程序脚本通信。但是,它可以触发内容脚本可以捕获的自定义DOM事件。讨论了here。
4)最后,从内容脚本中,您需要向应用脚本发送消息。 内容脚本调用 chrome.runtime.sendMessage
,而应用程序脚本使用chrome.runtime.onMessage
进行侦听。chrome.runtime.sendMessage
似乎不适用于使用{{1}注入的webview内容脚本}。解决方法是使用here所述的webview.executeScript()
。
这是一个洋葱结构,这就是为什么你需要2步“in”和2步“out”。您无法在传递给postMessage
回调的返回值中真正执行此操作,因为至少有一个“out”步骤将是异步的。
答案 1 :(得分:2)
您可以注入一个脚本,该脚本使用全局变量的值插入DOM节点。然后你返回那个节点的innerHTML,你就可以立即获得你的价值而不使用回调:
var code = "script = document.createElement('script'); script.text=\"var n=document.createElement('span');n.style.display='none';n.id='my-id';n.innerHTML=window.globalVar;document.body.appendChild(n)\"; document.head.appendChild(script);document.getElementById('my-id').innerHTML"
webview.executeScript(
{code: code},
function(results) {
console.log(results[0]);
});
只使用未使用的DOM节点的ID,你应该没问题。它对我有用。