" Chrome Apps" webview.executeScript访问guest虚拟机全局变量

时间:2014-11-10 19:09:41

标签: javascript google-chrome webview google-chrome-app cordova-chrome-app

我可以通过以下方式访问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".
   });

我该怎么做?

2 个答案:

答案 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,你应该没问题。它对我有用。