Chrome浏览器扩展开发系列之十二:Content Scripts
Content Scripts是运行在Web页面的上下文的JavaScript文件。通过标准的DOM,Content Scripts
可以操作(读取并修改)浏览器当前访问的Web页面的内容。
Content Scripts通常用于如下场景:
- 找到Web页面中的无效链接并修复
- 增大字体以突出显示
- 查找并处理DOM中的microformat
Content Scripts的使用限制条件:
- 不能访问如下chrome.* API
chrome.extensionAPI- chrome.i18n API
chrome.runtimeAPIchrome.storageAPI
- 不能访问Chrome扩展页面中定义的JavaScript变量和函数
- 不能访问Web页面或其他Content Scripts中定义的JavaScript变量和函数
乍一看,Content Scripts似乎无法与Chrome扩展的其他部分进行任何交互,但是通过Chrome的消息传递机制,Content Scripts可以间接地调用chrome.* API,访问Chrome扩展的数据,调用Chrome扩展的方法等,详见Chrome的消息传递部分。
此外,Content Scripts还可以通过“跨域XMLHttpRequest对象”访问Chrome扩展的其他部分。Content Scripts还可以与Web页面通过共享DOM进行通信。
在Chrome浏览器扩展中使用Content Scripts有两种方式。一种是在Chrome浏览器扩展中一直存在的Content Scripts,这需要在manifest.json文件中声明content_scripts如下:
{
"content_scripts": [
{
"matches": ["http://www.google.com/*"],
"css": ["mystyles.css"],
"js": ["jquery.js", "myscript.js"]
}
],
}
这种方式非常灵活,可以为Web页面注入多个JavaScript文件和CSS文件。
content_scripts中的属性说明如下:
|
名称 |
类型 |
必选/可选 |
说明 |
|
matches |
string数组 |
必选 |
Content Script注入的Web页面 |
|
exclude_matches |
string数组 |
可选 |
Content Script不注入的Web页面 |
|
include_globs |
string数组 |
可选 |
对于matches匹配的Web页面,进一步限定URL |
|
exclude_globs |
string数组 |
可选 |
对于matches匹配的Web页面,进一步排除URL |
|
match_about_blank |
boolean |
可选 |
是否注入Content Script到about:blank和about:srcdoc页面,默认false |
|
css |
string数组 |
可选 |
注入到匹配的Web页面中的CSS文件,顺序相关 |
|
js |
string数组 |
可选 |
注入到匹配的Web页面中的JS文件,顺序相关 |
|
run_at |
string |
可选 |
控制JS文件注入的时机,如"document_start", "document_end", "document_idle"。默认"document_idle"
|
|
all_frames |
boolean |
可选 |
控制JS文件是否在匹配的Web页面中的所有框架中运行。默认false表示只在顶层框架中运行 |
另一种是只在需要的时候(某事件发生)通过编程注入的Content Scripts,这需要在manifest.json文件中声明permissions如下:
{
"permissions": [
"tabs",
"http://www.google.com/*" //要注入Content Scripts的Web页面所在的域
],
}
这种方式能够针对个别Web页面有条件地注入Content Scripts。
声明必要的权限后,就可以在发生某些事件的时候动态注入必要的Content Scripts,示例如下:
chrome.browserAction.onClicked.addListener(
function(tab) { //tab对象表示当前(用户点击browser action的时候)处于活动状态的tab
chrome.tabs.executeScript({
//设置活动状态的tab显示的页面的document对象的属性
code: 'document.body.style.backgroundColor="red"'//通过JS代码
});
chrome.tabs.executeScript({file: "content_script.js"});//通过JS文件
});
Content Scripts的执行位于一个特殊的环境,我们称为isolated world。在这个环境中,Content Scripts能够访问当前Web页面的DOM,但是Content Scripts与当前Web页面自带的JavaScript变量和函数是不能直接互相访问的。而且被注入的每个Content Script之间也彼此独立,互不干扰。此外,对于一些共享的JavaScript对象,如window.onload事件对象,也都是彼此独立互不干扰的。
虽然Content Scripts与Web页面的JavaScript彼此独立,但是他们都能够访问Web页面的DOM,因此通过共享的DOM和消息机制,Content Scripts可以与Web页面的JavaScript进行通信。
另外,Content Scripts中要考虑安全问题,特别是Content Scripts通过跨域XMLHttpRequest对象获取的第三方结果,在作用于当前Web页面的时候要注意脚本注入攻击。
Content Scripts可以通过如下方式访问扩展中的其他文件:
//显示图片<extensionDir>/images/myimage.png
var imgURL = chrome.extension.getURL("images/myimage.png");
document.getElementById("someImage").src = imgURL;
Chrome浏览器扩展开发系列之十二:Content Scripts的更多相关文章
- Chrome浏览器扩展开发系列之十四
Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59 阅读:1361 评论:0 收藏:0 ...
- Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin
Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报 分类: PPAPI(27) 通过将浏览器 ...
- Chrome浏览器扩展开发系列之十九:扩展开发示例
翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...
- Chrome浏览器扩展开发系列之十六:扩展中可用的Chrome浏览器API
除了Chrome浏览器支持的chrome.* API之外,Chrome浏览器扩展还可以使用Chrome浏览器为Web页面或Chrome app提供的APIs.对于Chrome浏览器2支持的API,还可 ...
- Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API
i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中 ...
- Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象
XMLHttpRequest对象是W3C的标准API,用于访问服务器资源.XMLHttpRequest对象支持多种文本格式,如XML和JSON等.XMLHttpRequest对象可以通过HTTP和HT ...
- Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging
通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应 ...
- Chrome浏览器扩展开发系列之十:桌面通知Notification
Desktop Notification也称为Web Notification,是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件.Web Notification于2015.9.10成为 ...
- Chrome浏览器扩展开发系列之十一:NPAPI插件的使用
在Chrome浏览器扩展中使用HTML和JavaScript非常容易,但是如何重用已有的非JavaScript遗留系统代码呢?答案是将NPAPI插件绑定到Chrome浏览器扩展,从而实现在Chrome ...
随机推荐
- 教育类APP开发现新增长,多款APP该如何突围?
"十二五"以来,国家共出台相关的重大教育政策文件741个,而进入到"十三五"时期教育领域综合改革深入推进的关键期,不断促进教育现代化的实现.加快迈入人力资源强国 ...
- ECS_8080端口连接拒绝问题排查
原文链接 用户ECS网络设置 上图是用户ECS的网络示意图: ecs处于vpc网络下 ecs加入了一个安全组,该安全组出入方向均开放8080端口 ecs有两个网卡,一个私网主网卡(有虚线的网卡),一个 ...
- 如何优雅地实现Python通用多线程/进程并行模块
当单线程性能不足时,我们通常会使用多线程/多进程去加速运行.而这些代码往往多得令人绝望,需要考虑: 如何创建线程执行的函数? 如何收集结果?若希望结果从子线程返回主线程,则还要使用队列 如何取消执行? ...
- shell中如何进行算术运算
A=3 B=6 1.let算术运算表达式 let C=$A+$B2.$[算术运算表达式] C=$[$A+$B] 3.$(()) C=$(($A+$NB))
- 【JAVAWEB学习笔记】网上商城实战2:异步加载分类、Redis缓存分类和显示商品
网上商城实战2 今日任务 完成分类模块的功能 完成商品模块的功能 1.1 分类模块的功能: 1.1.1 查询分类的功能: 1.1.2 查询分类的代码实现: 1.1.2.1 创建 ...
- Python函数之简单总结
函数的定义 Python的函数定义使用关键字def,如定义一个返回绝对值的函数my_abs def my_abs(x): if x>=0: return x else: return -x 函数 ...
- 深入探索C++对象模型(六)
执行期语意学(Runtime Semantics) 对象的构造和析构(Object Constructor and Destructor) 一般而言,constructor和destructor的安插 ...
- openjdk7之编译和debug
大家也可以看我的博客: openjdk7之编译和debug,这里格式更好. 为了更好的学习JDK.HotSpot等源码,需要能debug JDK.HotSpot等源码.本文主要讲述,怎么编译open ...
- Analog/digital converter (ADC)
1.ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters. 所谓successive appro ...
- eclipse下启动tomcat项目,访问tomcat默认端口显示404错误
解决:打开eclipse的server视图,双击你配置的那个tomcat,打开编辑窗口,查看server locations,看看是否选择了第一个选项(默认是第一个选项),即use workspace ...