访问chrome扩展中当前选项卡的所有窗口变量

Sri*_*s B 6 javascript google-chrome-extension

任何人都可以发布用于访问chrome扩展中的窗口变量的代码.当我点击chrome扩展按钮时,我需要访问窗口变量.我正在获取窗口对象,但没有加载所有变量.我知道我们可以通过注入脚本来创建它.但我没有得到如何实现它.目前我正在尝试以下代码来获取当前活动选项卡的页面源.

 chrome.tabs.executeScript({code:
            "document.getElementsByTagName('html')[0].innerHTML"
        }, function(result) {
    var value = result[0];
    console.log(value);
    chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
        callback({
            url: tabs[0].url,
            title: tabs[0].title,
            jsonValue: value
        });
    });
}); 
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.非常感谢.

Emr*_*oin 12

您要求的是注入脚本以获取原始页面脚本中定义的变量的值.这个问题有两个答案:

1.谷歌官方回答

这是不可能的.注入页面的内容脚本是沙箱,无法访问原始页面javascript范围.这意味着您无法访问原始页面的javascript中定义的变量,函数和对象.并且您的变量,函数和对象将无法从原始页面访问.

仅共享页面的DOM.这允许您修改页面的内容.但是,您不能删除现有的事件处理程序.

这是出于明显的安全和安全原因.如果你在不知道它是原始页面的功能的情况下覆盖它,它就会破坏它.

请查看此处了解更多信息

2.非正式和肮脏的答案

有一种方法可以绕过铬砂箱限制.这带有共享DOM,允许您添加<script src="..."><\script>到页面.该脚本将在原始页面的javascript VM中加载和执行,因此您可以访问全局JavaScript范围.

但是这样,您将无法访问Chrome扩展程序API,因为您在原始页面中运行代码.因此,与后台页面或注入的内容脚本的通信将很困难.

执行此操作的常用方法是向<div>页面添加隐藏,并将要发送到内容脚本的结果放入其中.您将结果作为文本(例如,使用JSON.stringify),然后使用您的内容脚本读取结果.

它真的很脏,只能在最后一次尝试中使用.

  • 这个答案是错误的**.根本不需要肮脏的解决方案.Google官方方式支持`window.postMessage`.请参阅https://developer.chrome.com/extensions/content_scripts#host-page-communication (2认同)
  • @Pacerier 对于一个非常精确的问题,答案是正确的。这个答案是为了回答“我可以获得主页的窗口属性吗?”。就他而言,他无权访问主页的源代码。他无法修改主机页面的主要 JavaScript,因此他无法在主脚本和扩展之间进行任何通信(至少没有肮脏的黑客攻击)。 (2认同)
  • 这些评论超级有用!我同意@Pacerier 的说法,`window.postMessage` 是在这里做事的正确方式,但是插入脚本对我来说也非常有用......在我的情况下,我想登录到原始窗口的控制台,我正如@Emrys 所描述的那样,通过在页面中插入脚本来实现......金! (2认同)