繁体   English   中英

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

[英]How do I access ALL window objects from a 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

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

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

  • 每个选项卡都有自己的私有单独window对象
  • background.js也有自己的
  • 内容脚本有点棘手,因为虽然他们名义上住在页面内,但他们实际上保持着相互尊重的距离:看到孤立的世界
  • 我不熟悉chrome.tabs.executeScript但不知怎的,我不相信任何超出基础知识的东西

一种方法可以如下:

使用chrome.tabs.create从后台脚本打开相关页面:因此,背景将完全控制并your_object于所述选项卡以及其中的windowdocumentyour_object 处理事物的异步方面也会更容易:你将学会喜欢回调

根据有关UX的要求,另一种选择是处理异步请求,并完全在background.js获取your_object

最后一个提示:您从商店下载的扩展程序只是Chrome配置文件中的压缩文件。 找到tapermonkey.crx或其他什么,解压缩它并阅读源代码以找出它的作用。

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

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

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

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

根据https://developer.chrome.com/extensions/content_scripts中的文档

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM