【问题标题】:Accessing all the window variables of the current tab in chrome extension [duplicate]在chrome扩展中访问当前选项卡的所有窗口变量[重复]
【发布时间】:2015-12-15 04:23:48
【问题描述】:

任何人都可以发布用于访问 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
        });
    });
}); 

请帮我解决这个问题。将不胜感激。

【问题讨论】:

  • 你现在用这个脚本得到了什么?什么时候执行?
  • @EmrysMyrooin,我正在获取当前选项卡的页面源。但是我需要获取页面源中的所有窗口变量
  • 那么为什么不直接返回window 对象呢?比如chrome.tabs.executeScript({code: "window" }, function(result) { ... })我没试过,但没有理由不工作:-)
  • 如果问题是如何获取源页面的所有 javascript vraiables,Google 的官方回答是:你不能。但我认为这不是你想要的。
  • Okey 忘了这个。发送windowvariable 没有简单的解决方案。原因是它包含无法以 JSON 格式表示的循环引用。因此,您拥有的更好的解决方案是从 window 对象中提取想要的值,然后只发回这些提取的值。或者您可以尝试使用 JSON 以外的其他格式来表示您的数据,但为此您必须注入一个外部库...

标签: javascript google-chrome-extension


【解决方案1】:

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

1。谷歌官方回答

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

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

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

Take a look here for more information

2。非官方和肮脏的答案

有一种方法可以绕过 chrome 沙盒限制。这与共享 DOM 一起提供,允许您向页面添加 <script src="..."><\script>。该脚本将在原始页面的 javascript VM 中加载和执行,因此您可以访问全局 javascript 范围。

但是这种方式,将无法访问 Chrome 扩展 API,因为您在原始页面中运行代码。所以与后台页面或注入的Content Script的通信会很困难。

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

真的很脏,只能在最后一次尝试时使用。

【讨论】:

  • 或在插件和主页javascript之间来回发送消息,例如:stackoverflow.com/a/9636008/32453
  • 这个答案是错误的。根本不需要肮脏的解决方案。谷歌官方方式支持window.postMessage。见developer.chrome.com/extensions/…
  • @Pacerier 对于一个非常精确的问题,答案是正确的。这个答案是为了回答“我可以获取主机页面的窗口属性吗?”。在他的情况下,他无权访问主机页面的源。他无法修改主机页面的主要 JavaScript,因此他无法在主脚本和扩展程序之间进行任何通信(至少没有肮脏的 hack)。
  • @EmrysMyrooin,你还是不明白。“脏”共享 DOM 不是唯一的方法;这就是为什么我说使用允许通信的window.postMessage。所以你获取变量x,然后将它传递给window.postMessage(x, '*'),你注入的内容脚本将能够通过监听window.addEventListener("message", (e) => console.log(e.data))来读取变量x。不需要 DOM hack。您可以以同样的方式将数据从内容脚本传递到网页。
  • 这些cmets超级好用!我同意@Pacerier 的观点,window.postMessage 是在这里做事的正确方式,但是插入脚本对我来说也非常有用。在我的情况下,我想登录到原始窗口的控制台,我已经正如@Emrys 所描述的那样,通过在页面中插入脚本来实现......黄金!
猜你喜欢
  • 2021-07-30
  • 2014-06-03
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多