簡體   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