任何人都可以发布用于访问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
});
});
});
请帮我解决这个问题。非常感谢。
答案 0 :(得分:10)
您要求的是注入脚本以获取原始页面脚本中定义的变量的值。这个问题有两个答案:
这是不可能的。注入页面的内容脚本是沙箱,无法访问原始页面javascript范围。这意味着您无法访问原始页面的javascript中定义的变量,函数和对象。并且您的变量,函数和对象将无法从原始页面访问。
仅共享页面的DOM。这允许您修改页面的内容。但是,您不能删除现有的事件处理程序。
这是出于明显的安全和安全原因。如果你在不知道它是原始页面的功能的情况下覆盖它,它就会破坏它。
Take a look here for more information
有一种方法可以绕过铬砂箱限制。这带有共享DOM,允许您向页面添加<script src="..."><\script>
。该脚本将在原始页面的javascript VM中加载和执行,因此您可以访问全局JavaScript范围。
但是这样,无法访问Chrome扩展程序API,因为您在原始页面中运行代码。因此,与后台页面或注入的内容脚本的通信将很困难。
执行此操作的常用方法是向页面添加隐藏的<div>
,并将要发送到内容脚本的结果放入其中。您将结果作为文本(例如,使用JSON.stringify),然后使用内容脚本读取结果。
它真的很脏,只能在最后一次尝试中使用。