【问题标题】:Chrome Extension that loads Page Source of the active tab加载活动选项卡的页面源的 Chrome 扩展程序
【发布时间】:2013-09-05 17:33:21
【问题描述】:

我希望你能帮助我。

我正在尝试在 Chrome 中创建一个扩展,它将活动标签的源加载到变量中。

到目前为止我有:

ma​​nifest.json

{
"name": "My Extension",
"manifest_version": 2,
"version": "0.1",
"description": "Does some simple stuff",
"browser_action": {
    "default_icon": "logo.png"
},

"background": {    
"scripts": ["main.js"]}}

ma​​in.js

chrome.browserAction.onClicked.addListener(
  function(tab) {
   var ps1 = document.getElementsByTagName('html')[0].innerHTML;
   window.alert(ps1);
});

但这会加载空白页面的页面源。我需要做什么才能获取活动页面的来源。

我已经阅读了一些内容,我认为我需要使用带有一些监听功能的内容脚本,我一直在搜索,但所有答案在我看来都非常复杂。有谁能给我举个简单的例子吗?

非常感谢您的反馈!

问候


在 AdrianCooney 回答后更新:

我将清单更改为包含

 "permissions": [
  "tabs"
  ]

然后在 main.js 我做了

chrome.browserAction.onClicked.addListener(function(activeTab) {
 chrome.tabs.query({ currentWindow: true, active: true }, 
  function (tabs) {
   var ps1=document.getElementsByTagName('html')[0].innerHTML;
   window.alert(ps1);
 })
});

当我按下扩展按钮时,我会得到类似的东西

<html></html>
  <body><script src="main.js"></script>
  </body>

...无论我激活了哪个标签。

再试一次 chrome.tabs.getCurrent

chrome.browserAction.onClicked.addListener(function(activeTab) {
 chrome.tabs.getCurrent(
  function (tabs) {
   var ps1=document.getElementsByTagName('html')[0].innerHTML;
   window.alert(ps1);
  })
 });

以上版本的 main.js 给出的输出与之前的完全相同,无论我在哪个页面都处于活动状态。

【问题讨论】:

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


【解决方案1】:

对于希望使用 Manifest V3 执行此操作的人来说,事情要简单得多。假设您在扩展的根目录中有一个脚本 parse_page.js,其中包含您要执行的任何代码:

var ps1 = document.getElementsByTagName('html')[0].innerHTML;            
window.alert(ps1);

来自the docs,有两种方法可以让它执行:

(1) 使用静态声明注入:对需要自动运行的脚本使用此方法。只需将以下内容添加到您的 ma​​nifest.json:

"content_scripts": [
  {
    "matches": ["<all_urls>"],
    "js": ["parse_page.js"]
  }
],

每当您访问新页面时,该脚本都会运行。如果您只希望它在某些 URL 上执行,您可以调整上面的 matches。

(2) 以编程方式注入:将此方法用于需要运行以响应事件或特定场合的脚本。将以下内容添加到您的 ma​​nifest.json:

"permissions": ["activeTab", "scripting"],
"background": {
  "service_worker": "background.js"
},
"action": { }

接下来,在 background.js 中,添加以下内容:

chrome.action.onClicked.addListener((tab) => {
    chrome.scripting.executeScript({
        target: { tabId: tab.id },
        files: ['parse_page.js']
    });
});

在此示例中,只要您单击扩展程序的图标,脚本就会运行。

【讨论】:

    【解决方案2】:

    在 Chrome 47 中你需要将“activeTab”添加到权限中,否则它不起作用。使用“标签”是行不通的。

    ma​​nifest.json:

    {
    "name": "Rafi extension",
    "manifest_version": 2,
    "version": "7",
    "description": "Open something",
    "browser_action": {
        "default_icon": "logo.png"
    },
    "permissions": [
      "activeTab"
      ],
    "background": {    
    "scripts": ["main.js"]}
    }
    

    【讨论】:

      【解决方案3】:

      main.js 下的这段代码有效!!!谢谢你们的提示,他们为我节省了很多时间!

      chrome.browserAction.onClicked.addListener( 
        function(tab) {
         chrome.tabs.executeScript(
           null,{
             code:"var ps1 = document.getElementsByTagName('html')[0].innerHTML;            
             window.alert(ps1);"});
                }
      );
      

      【讨论】:

        【解决方案4】:

        正如所指出的,您需要在活动选项卡的上下文中运行代码。一种方法是使用chrome.tabs.executeScript:

        chrome.browserAction.onClicked.addListener( function() {
          chrome.tabs.executeScript(
            { 
              code: "document.getElementsByTagName('html')[0].innerHTML;"
            }, 
            function (ps1) {
              window.alert(ps1);
            }
          );
        });
        

        【讨论】:

        • 感谢您提供该代码,但我有一个问题。如何在这段代码中定义 ps1?我试过code: "var ps1 = document...",但警报返回undefined
        • @Matt 代码按原样工作,您无需添加任何声明。回调函数将接收执行代码评估的最后一个表达式作为参数。您在下面发布的答案的问题是您在后台脚本的上下文中没有可用的值。
        【解决方案5】:

        后台脚本与当前页面隔离,因为它们被设计为无论页面内容如何都是持久的。您需要使用chrome.tabs API,特别是chrome.tabs.getCurrent。拥有当前选项卡后,您可以将代码注入窗口。这就是你上面的 sn-p 的用武之地。

        您需要在清单文件中为您的权限添加“选项卡”。

        【讨论】:

        • 我尝试了你的建议以及我发现的其他东西,现在终于有一些东西可以工作了,但仍然不如预期。更多想法?
        猜你喜欢
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多