Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;Chrome应用程序“;webview.executeScript访问来宾全局变量_Javascript_Google Chrome_Webview_Google Chrome App_Cordova Chrome App - Fatal编程技术网

Javascript &引用;Chrome应用程序“;webview.executeScript访问来宾全局变量

Javascript &引用;Chrome应用程序“;webview.executeScript访问来宾全局变量,javascript,google-chrome,webview,google-chrome-app,cordova-chrome-app,Javascript,Google Chrome,Webview,Google Chrome App,Cordova Chrome App,我可以通过以下方式访问Chrome应用程序Webview HTML: webview.executeScript( {code: 'document.documentElement.innerHTML'}, function(results) { // results[0] would have the webview's innerHTML. }); 但我想得到来宾中全局变量的值,如下所示: webview.executeScript( {code:

我可以通过以下方式访问Chrome应用程序Webview HTML:

webview.executeScript(
    {code: 'document.documentElement.innerHTML'},
    function(results) {
      // results[0] would have the webview's innerHTML.
    });
但我想得到来宾中全局变量的值,如下所示:

webview.executeScript(
   {code: 'window.globalVar'},
   function(results) {
   // results[0] should have the webview's value of "globalVar".
   });

我如何才能做到这一点?

总结所需步骤的答案

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

2) 由于页面的真实
窗口是隔离的,因此需要一个页面级脚本来访问它。如前所述,将其注入
标记

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

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


这是一个洋葱型的结构,这就是为什么你需要两步“进”和两步“出”。您不能在传递给
executeScript
回调的返回值中真正执行此操作,因为至少有一个“out”步骤是异步的。

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

谢谢Xan,你推荐的链接上有很多内容。很难确定它是否适用于当前的“Chrome应用程序网络视图”。看起来我可能缺少manifest.json中的配置,但从那里开始,我仍然迷路了。另一篇文章是关于Chrome扩展的,我不确定有多少应用于将在Cordova中运行的Chrome应用程序。重点是,
window
页面和内容脚本的对象是孤立的。它是否是网络视图并不重要。但是你可以通过注入一个页面级脚本来访问“real”
窗口。我可以注入一个脚本,让它与来宾机上的数据交互,但使用一个简单的“return window.globalVar”并不会将数据发送回主机。我想知道我是否应该用“消息传递”来代替。。让我找一个问题。感谢您的耐心和完整的回答,我将尝试一下;)仅供参考,我正在尝试从BING地图获取纬度和经度,以显示在谷歌地图上。请这样做;我不是100%确定答案,因为我几乎没有应用经验。但这就是
executeScript
在扩展中的工作方式。我不确定这个工具有多普遍,但我正在使用Chrome开发编辑器(开发者预览)来玩Cordova Chrome应用程序,它非常棒。非常快速和简单的模拟一个简单的测试。成功!我想我找到了从客人那里获取数据的简单快捷方式。插入将数据写入来宾控制台的脚本标记,然后使用以下命令:webview.addEventListener('consolemessage',function(e){Console.log('Guest page logged a message:',e.message);});我认为这不是一个很好的快捷方式,因为有问题的页面也可以打印到控制台。一个自定义事件不太可能干扰。@fareednamrouti谢谢。这只是我想到的一个想法:)实际上这是安全问题,被认为是黑客哈哈