首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Chrome扩展代码vs内容脚本vs注入脚本

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

Stack Overflow用户
提问于 2012-03-29 04:40:37
回答 1查看 55.2K关注 0票数 63

我试图让我的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文件中的其他函数--

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-29 05:41:34

Chrome扩展中的JavaScript代码可以分为以下几组:

  • Extension代码-对所有允许的 API的完全访问权限。

这包括background page以及可以通过chrome.extension.getBackgroundPage()直接访问它的所有页面,例如browser pop-ups.

  • (通过清单文件或 ) -对某些 chrome API访问,完全访问页面的DOM (不是对任何window对象,包括框架)。

内容脚本在扩展和页面之间的作用域中运行。内容脚本的全局window对象不同于页面/扩展的全局namespace.

  • Injected脚本(通过内容脚本中的this method )-完全访问页面中的所有属性。无法访问任何 chrome.* API。

注入的脚本的行为就像它们是由页面本身包含的一样,并且没有以任何方式连接到扩展。有关各种注入方法的详细信息,请参阅this post

要将消息从注入脚本发送到内容脚本,必须使用事件。有关示例,请参阅this answer。注意:在扩展中从一个上下文到另一个上下文传输的消息是自动(JSON)、-serialised和解析的。

在您的示例中,后台页面(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();"});
    }
});
票数 169
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9915311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档