当前位置: 首页 > 面试题库 >

Chrome扩展程序代码vs内容脚本vs注入脚本

费德宇
2023-03-14
问题内容

我正在尝试让我的Chrome扩展程序在init()加载新页面时运行该功能,但是在尝试了解如何执行此操作时遇到了麻烦。据我了解,我需要在background.html中执行以下操作:

  1. 使用chrome.tabs.onUpdated.addListener()来检查时,页面变更
  2. 使用chrome.tabs.executeScript运行的脚本。

这是我的代码:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    chrome.tabs.executeScript(null, {code:"init();"});
});

//script.js
function init() {
    alert("It works!");
}

我还想知道init()函数是否可以访问位于其他JS文件中的其他函数?


问题答案:

Chrome扩展程序中的JavaScript代码可以分为以下几类:

  • 扩展代码-完全访问所有允许的chrome.*API。
    这包括背景页面,以及可以直接通过它访问的所有页面,例如浏览器弹出窗口。

  • 内容脚本 (通过清单文件或chrome.tabs.executeScript)- 部分访问某些chromeAPI,完全访问页面DOM( 访问任何window对象,包括框架)。
    内容脚本在扩展名和页面之间的范围内运行。window内容脚本的全局对象不同于页面/扩展名的全局名称空间。

  • 注入的脚本(通过Content脚本中的此方法-完全访问页面中的所有属性。 无法访问任何chrome.*API。
    注入的脚本的行为就像页面本身包含的一样,并且不以任何方式连接到扩展。

在您的情况下,chrome.tabs.onUpdated可能会在script.js评估内容脚本之前调用后台页面()中的代码。因此,您会得到一个ReferenceError,因为init不是。

另外,在使用时chrome.tabs.onUpdated,请确保测试页面是否已完全加载,因为该事件会触发两次:加载前和完成时:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete') {
        // Execute some script when the page is fully (DOM) ready
        chrome.tabs.executeScript(null, {code:"init();"});
    }
});


 类似资料:
  • 问题内容: 我正在做一个插件来对界面进行一些转换。我不断收到(典型的跨网站问题) 但作为扩展程序,它应该可以访问iframe的内容 … 没有人知道如何访问它的内容以便可以被捕获吗? 问题答案: 通常,没有直接访问其他来源对象的直接方法。如果要在不同框架中的内容脚本之间 安全地 通信,则必须将消息发送到后台页面,该页面又将消息发送回选项卡。 这是一个例子: 的一部分: : : 后台脚本“ bg.js

  • 问题内容: 我有一个chrome扩展程序,可以在网站上进行一些更改(编辑评论)。 在站点上进行了最近更改之后(站点不是我的站点)-使用ajax加载了注释块(之前是简单的发布请求,整个页面都重新加载了)。 现在,如果我第一次加载页面-内容脚本可以工作,但是当我转到下一页时,说页面#2-使用ajax添加注释,并且不再运行扩展脚本。所以评论并没有改变我想要的方式。 有没有简单的方法来监听页面更改DOM并

  • 问题内容: 我知道这个问题已经在很多帖子中问过了,但老实说我不明白。我不熟悉JavaScript,Chrome扩展程序和其他所有功能,并且已经完成了此类课程。因此,我需要制作一个插件,该插件将使用跨域请求在任何给定页面上计算DOM对象。到目前为止,我已经可以使用Chrome Extension API来实现这一目标。现在的问题是,我需要在contentScript.js文件的popup.html页

  • 问题内容: 我正在尝试从弹出窗口访问activeTab DOM内容。这是我的清单: 我真的很困惑,背景脚本(持久性事件页:false)还是content_scripts是可行的方法。我已经阅读了所有文档和其他SO帖子,但对我来说仍然没有意义。 有人可以解释为什么我可能会用另一个。 这是我一直在尝试的background.js: 我只是从弹出控制台执行此操作: 我越来越: 更新: content.j

  • 当我运行 :(32/0,省略)1100 0001 0111 1110 0000 0000 0000 < li> :(第32页,共1页,略)1100 0001 0111 1110 0000 0000 0000 为什么Javascript计算

  • 我是编程新手,刚开始学习JS。我尝试在Visual Studio代码上通过“code runner”运行我的第一个代码,但它没有给我输出。在此处输入图像描述