1 介绍
1.1 使用场景
Content Script 是一个很神奇的东西。它可以读取和修改页面内容。比如一些应用场景
- 过滤广告:将页面中的广告区块过滤掉,只显示主要内容
 - 翻译页面中的外语
 - 分享页面内容到社交平台
 
1.2 限制
- Use chrome.* APIs, with the exception of:
- extension ( getURL , inIncognitoContext , lastError , onRequest , sendRequest )
 - i18n
 - runtime ( connect , getManifest , getURL , id , onConnect , onMessage , sendMessage )
 - storage
 
 - 不能使用扩展页面中的变量和方法
 - 不能使用定义在其它扩展的 Content Script 中的变量和方法
 
2 使用
2.1 Manifest
1  | {  | 
2.2 注入
2.2.1 与 browserAction 配合
注入并执行一段代码:
1  | chrome.browserAction.onClicked.addListener(function(tab) {  | 
执行上面的代码先获取权限:
1  | "permissions": [  | 
或直接执行一个文件:
1  | chrome.tabs.executeScript(null, {file: "content_script.js"});  | 
blocking 会将回调函数设置为同步处理,请求会等待回调完成。使用该参数需要在 permission 中添加 webRequestBlocking 权限。
2.2.2 获取资源文件 URL
1  | /Code for displaying <extensionDir>/images/myimage.png:  | 
3 要点
3.1 ContentScript 在独立环境运行
3.2 注入的方式
3.2.1 整个文件
1  | var s = document.createElement('script');  | 
注意: 将 script.js 加入到 “web_accessible_resources”
3.2.2 代码片段
1  | var actualCode = `// Code here.  | 
3.2.3 更多方式
参见: Insert code into the page context using a content script
3.3 注入的时机
3.3.1 document_start
- 在 
document.readyState事件前被触发。 document.head 和 document.body 还不可用,只有 documentElement
1
2
3
4var s = document.createElement ("script");
s.src = "http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js";
s.async = false;
document.documentElement.appendChild (s);1
2
3
4var s = document.createElement ("script");
s.src = chrome.extension.getURL ("MyPwnCode.js");
s.async = false;
document.documentElement.appendChild (s);如果需要操作其它 DOM,可以等待
DOMContentLoaded事件1
2
3
4
5
6
7document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
function fireContentLoadedEvent () {
console.log ("DOMContentLoaded");
// PUT YOUR CODE HERE.
//document.body.textContent = "Changed this!";
}
3.3.2 document_end
- DOM 已解析完成
 - 资源如 image 和 frame 还没有加载(onload)
 
3.3.3 document_idle
- 晚于 document_end,
 - 也晚于 window.onload
 - DOM 已解析完成