如何从Chrome扩展程序访问所有窗口对象?

时间:2016-04-17 05:21:39

标签: javascript google-chrome google-chrome-extension

我正在为工作开发Chrome扩展程序,它需要做的一件事就是在向我们的服务器发出异步请求后,读取(仅读取,而不是修改)我们发送回网站的对象。基本上我需要阅读window.<our object name>对象并获取其中的内容。

现在,我知道这是可能的,因为我是在我写的Tampermonkey脚本中做到的。我能够console.log(window.<our object name>)并且它进来了。

Tampermonkey是一个Chrome扩展程序,因此没有任何内在原因可以访问某些内容而另一个扩展程序无法访问。

但是当我尝试从内容脚本和注入的代码访问这个对象时,我什么也得不到。当我只获得window个对象时,它只是部分出现,好像扩展名对它的某些部分是盲目的。但如果我在页面上的控制台中,并且我调用window,我会得到一个完整的窗口对象。真气。

因此,如果内容脚本不起作用,并且注入的脚本不起作用,并且弹出脚本没有理由在这里有任何好处,那么如何做到这一点?

非常感谢!

更新:根据要求,这里是manifest.json(我使用了page_redder示例并解决了这个问题,以确保我没有犯任何奇怪的错误):

{
  "name": "Page Redder",
  "description": "Make the current page red",
  "version": "2.0",
  "permissions": [
    "activeTab"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_title": "get my object"
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ],
  "manifest_version": 2
}

这是content.js:

var getWindow = window.setTimeout(function() { console.log("From content script: " + window.<OBJECT NAME>); }, 5000);

这是background.js:

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.    

// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
  // No tabs or host permissions needed!
  chrome.tabs.executeScript({
    code: 'console.log("From injected script:" + window.<OBJECT NAME>);'
  });
});

跑步时,我得到:

来自内容脚本:undefined 从注入的脚本:undefined

但如果我做窗户。从控制台,我明白了。我甚至添加了一个超时,以确保内容脚本没有尝试获取尚未加载的内容。但我可以在脚本运行之前手动检索对象,它仍然给我未定义。

3 个答案:

答案 0 :(得分:0)

有趣的问题。这是一个快速且可能不完整的答案:

  • 每个标签都有自己独立的window对象
  • background.js也有自己的
  • 内容脚本有点棘手,因为当他们名义上居住在页面内时,他们实际上保持一个尊重的距离:见isolated worlds
  • 我不熟悉chrome.tabs.executeScript但不知何故我会用基本的东西来信任它

一种方法可以如下:

使用chrome.tabs.create从后台脚本中打开相关页面:因此,背景将对所述标签及其中的windowdocumentyour_object具有完全控制和优势。处理事物的异步方面也会更容易:你会学会爱callbacks

根据UX的要求,另一种选择是处理异步请求,并完全在your_object

中提取background.js

最后一个提示:您从商店下载的扩展程序只是Chrome配置文件中的压缩文件。查找tapermonkey.crx或其他内容,解压缩并阅读资源以确定其作用。

哦,依靠超时来处理异步性必然会产生随机结果。

答案 1 :(得分:0)

Soo,这有点像hacky,但我能够做到并且有效。

要访问主机window可用的所有内容,我必须创建一个script元素,将所需的所有代码放在那里,并添加document.body.appendChild(script)以使其正常工作

不是最性感的做事方式,但它可以完成小任务的工作。

答案 2 :(得分:-2)

根据https://developer.chrome.com/extensions/content_scripts

中的文件
  

但是,内容脚本有一些限制。他们不能

     
      
  • 使用由网页或其他内容脚本定义的变量或函数。
  •   

因此,您可以从内容脚本访问公共窗口变量,但不能从网页的javascript,另一个内容脚本或者您发送到网站的对象中创建的变量访问。