【问题标题】:"Chrome Apps" webview.executeScript access guest global varibles“Chrome Apps” webview.executeScript 访问访客全局变量
【发布时间】:2015-01-07 04:31:39
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 感谢 Xan,您建议的链接上有很多内容。很难弄清楚它是否适用于当前的“Chrome App Webviews”。看来我可能缺少 manifest.json 中的配置,但从那里开始,我仍然迷路了。另一篇文章是关于 Chrome 扩展的,我不确定有多少适用于 Chrome 应用程序,它将在 Cordova 中运行。
  • 重点是,window 页面对象和内容脚本是隔离的。它是否是 webview 并不重要。但是您可以通过注入页面级脚本来访问“真实的”window
  • 明确一点,我面临的挑战是从客人那里获取数据。我可以注入一个脚本并让它与来宾上的数据交互,但使用简单的“返回 window.globalVar”不会将数据发送回主机。我想知道我是否应该改用“消息传递”?
  • 对.. 让我找到一个问题。 stackoverflow.com/a/26740141/934239

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


【解决方案1】:

您可以注入一个脚本,该脚本使用全局变量的值插入一个 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,就可以了。它对我有用。

【讨论】:

  • @fareednamrouti 谢谢。这只是我想到的一个想法:)
  • 实际上这是安全问题,被认为是黑客 LOL
【解决方案2】:

总结所需步骤的答案。

1) 您将带有webview.executeScript() 的内容脚本注入到嵌入页面中。

2) 由于页面真正的window是隔离的,所以需要页面级的脚本才能访问。如here 所述,您可以使用<script> 标签注入它。

3) 页面级脚本可以访问window 对象,但不能与应用脚本对话。但是,它可以触发内容脚本可以捕获的自定义 DOM 事件。讨论here

4) 最后,您需要从内容脚本向您的应用脚本发送消息。 内容脚本调用chrome.runtime.sendMessage,而应用脚本侦听chrome.runtime.onMessage chrome.runtime.sendMessage 似乎不适用于注入webview.executeScript() 的webview 内容脚本。一种解决方法是使用postMessage,如here 所述。

这有点像洋葱结构,这就是为什么你需要 2 步“进入”和 2 步“退出”。您不能在传递给executeScript 回调的返回值中真正做到这一点,因为至少有一个“out”步骤将是异步的。

【讨论】:

  • 感谢您的耐心和完整的回答,我会试一试;)仅供参考,我正在尝试从 BING 地图中获取纬度和经度以显示在 Google 地图上。
  • 请做;我不能 100% 确定答案,因为我几乎没有使用应用程序的经验。但这就是 executeScript 在扩展中的工作方式。
  • 我不确定这个工具有多普遍,但我正在使用 Chrome Dev Editor(开发者预览版)来玩 Cordova Chrome 应用程序,它很棒。快速轻松地模拟一个简单的测试。
  • 成功!我想我找到了从访客那里获取数据的简单快捷方式。注入将数据写入访客控制台的脚本标签,然后使用: webview.addEventListener('consolemessage', function(e) { console.log('Guest page logged a message: ', e.message); }) ;
  • 我不认为这是一个很好的快捷方式,因为有问题的页面也可以打印到控制台。自定义事件干扰的可能性较小。
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2016-05-04
相关资源
最近更新 更多