Chrome浏览器扩展开发系列之十二:Content Scripts

Content Scripts是运行在Web页面的上下文的JavaScript文件。通过标准的DOM,Content Scripts

可以操作(读取并修改)浏览器当前访问的Web页面的内容。

Content Scripts通常用于如下场景:

  • 找到Web页面中的无效链接并修复
  • 增大字体以突出显示
  • 查找并处理DOM中的microformat

Content Scripts的使用限制条件:

  • 不能访问如下chrome.* API

    • chrome.extension API
    • chrome.i18n API
    • chrome.runtime API
    • chrome.storage API
  • 不能访问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如下:

1 {
2   "content_scripts": [
3     {
4       "matches": ["http://www.google.com/*"],
5       "css": ["mystyles.css"],
6       "js": ["jquery.js", "myscript.js"]
7     }
8   ],
9 }

这种方式非常灵活,可以为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"

  • "document_start"表示在CSS文件之后,DOM构建或其他脚本运行之前,注入JS文件。
  • "document_end",表示在DOM构建结束之后,图片或框架加载之前,注入JS文件。
  • "document_idle"表示在"document_end"与触发window.onload事件之间的某个时间,注入JS文件,具体时间可以根据页面的内容和加载的进度优化。

all_frames


boolean


可选


控制JS文件是否在匹配的Web页面中的所有框架中运行。默认false表示只在顶层框架中运行

另一种是只在需要的时候(某事件发生)通过编程注入的Content Scripts,这需要在manifest.json文件中声明permissions如下:

1 {
2   "permissions": [
3     "tabs",
4     "http://www.google.com/*" //要注入Content Scripts的Web页面所在的域
5   ],
6 }

这种方式能够针对个别Web页面有条件地注入Content Scripts。

声明必要的权限后,就可以在发生某些事件的时候动态注入必要的Content Scripts,示例如下:

1 chrome.browserAction.onClicked.addListener(
2   function(tab) { //tab对象表示当前(用户点击browser action的时候)处于活动状态的tab
3     chrome.tabs.executeScript({
4       //设置活动状态的tab显示的页面的document对象的属性
5       code: ‘document.body.style.backgroundColor="red"‘//通过JS代码
6     });
7     chrome.tabs.executeScript({file: "content_script.js"});//通过JS文件
8 });

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可以通过如下方式访问扩展中的其他文件:

1 //显示图片<extensionDir>/images/myimage.png
2 var imgURL = chrome.extension.getURL("images/myimage.png");
3 document.getElementById("someImage").src = imgURL;
时间: 2024-10-12 17:25:02

Chrome浏览器扩展开发系列之十二:Content Scripts的相关文章

Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机(native messaging host)",Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机"之后,Chrome浏览器会在独立的

Chrome浏览器扩展开发系列之十四

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0      [点我收藏+] 通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机(native messaging host)",Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的"本地消息主机"

Chrome浏览器扩展开发系列之十九:扩展开发示例

翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深股票价格变化实时追踪提醒”软件能够实时获取用户指定的股票的价格等参数,并根据用户设置的价格区间进行越界提醒.该软件目前只实现了两部分,一个是options页面,用以配置用户要监听的股票及股票的价格区间.另一个是browser action类型的popup页面,供用户查看股票当前价格,并通过图标的Ba

Chrome浏览器扩展开发系列之十八:扩展的软件国际化chrome.i18n API

i18n是internationalization 的简写,这里将讨论软件国际化的问题.熟悉软件国际化的朋友应该知道,软件国际化要求,页面中所有用户可见的字符串都必须置于资源属性文件中.资源属性文件中的资源是形如“key=value”的键值对,一行一个.其中key为资源的标识符,用于HTML页面中,根据当前页面的Locale确定要使用的资源.value是资源的值,不同的Locale对应的资源值不同,在资源文件中统一用Unicode编码. 通过chrome.i18n API和相关的资源配置文件,可

Chrome浏览器扩展开发系列之十:桌面通知Notification

Desktop Notification也称为Web Notification,是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件.Web Notification于2015.9.10成为W3C推荐标准,网址https://www.w3.org/TR/notifications/.每个通知对话框都包括title, direction, language和origin.通知对话框还可以有body, tag, icon URL和icon image. 通知必须获得用户的授权才能够显示,从

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

通过将浏览器所在客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机(native messaging host)”,Chrome浏览器扩展还可以与客户端本地应用之间收发消息. 客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机”之后,Chrome浏览器会在独立的进程中启动该本地应用,并通过标准输入/输出流(stdin/stdout)进行消息通信. 1)      本地应用的配置文件的内容 本地应用要能够成为“本地消息主机”,必须有一个manifest.json配置文件(文件名

Chrome浏览器扩展开发系列之八:Chrome扩展的数据存储

Google Chrome浏览器扩展可以使用如下任何一种存储机制: HTML5的localStorage API实现的本地存储(此处略) Google的chrome.storage.* API实现的浏览器存储 Google的chrome.cookies.* API实现的cookie存储 1) chrome.storage API实现的浏览器存储 Chrome浏览器扩展通过chrome.storage.* API,可以存取数据或监听数据的变化. 在manifest.json文件中注册storage

Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API

chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象. 对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下: 1 chrome.alarms.onAlarm.addListener(function(alarm) { 2 appendToLog('alarms.onAlarm --' 3 + ' name: ' + alarm.name 4 + ' scheduledTime: ' + alarm.sched

Chrome浏览器扩展开发系列之九:Chrome浏览器的chrome.alarms.* API

Chrome浏览器扩展程序通过chrome.alarms.* API,可以制定计划周期性地执行代码,或在指定时间执行代码. 要使用chrome.alarms.* API,首先需要在manifest.json文件中声明alarms授权如下: { "permissions": [ "alarms" ], } chrome.alarms.Alarm对象的属性如下: 属性名 类型 必选/可选 注释 name string 必选 alarm的名字 scheduledTime