编写chrome插件之前,需要熟悉一下相应的chrome插件开发环境。从编写hello world开始,参考阅读官方的教程,是一个不错的选择。这里主要是基于chrome的官方教程,稍稍做了一些修改和扩充,总结成了如下的几个部分。

在chrome中编写插件和写网页应用基本一致,采用的是javascript+css+html的方式。所以对于用过chrome浏览器审阅过一些网页的源码,写过网页或者脚本的人而言,编写chrome的插件感觉到还是比较熟悉的。

一、chrome插件和用户的几种交互方式

比较常见的插件形式是:

1.browser action:即在浏览器的右上角有一个新增的显示插件图标的按钮,用户点击该按钮即可以触发插件的应用逻辑;

2.backgroud javascript:这种情况下插件没有对应的图标和按钮,在chrome启动时,插件运行在自己的单独的背景线程中。与用户的交互方式通常是在某些相关网页加载完之后,通过javascript对该网页进行修改,将插件逻辑嵌入到页面html代码中。

3.page action:这种插件形式在需要时在浏览器地址栏中弹出一个图标。

更多:见Developer's Guide - Google Chrome

二、通过browser action实现hello world

2.1 程序的文件清单

先来看看hello world插件的文件清单,如下图所示。其中icon.png用于图标的显示,manifest.json是chrome 插件的基本配置文件,popup.html用于下拉菜单的构建,popup.js是和popup.html对应的js文件。

2.2 manifest.json文件

{
"manifest_version":2, "name":"one-click hello_world",
"description":"my first chrome extension-browser action",
"version":"1.0",
"permissions":[
"https://*/*",
"http://*/*"
],
"browser_action":{
"default_icon":"icon.png",
"default_popup":"popup.html"
}
}

manifest.json是chrome插件的配置文件,其基本内容如上所示。"manifest_version"字段默认设置为2。permissions字段设置了插件的基本权限,即具有访问所有http链接的权限。browser_action字段中default_icon和default_popup分别和之前的icon.png,popup.html文件相对应。

2.3 popup.html

<!doctype html>
<html>
<head>
<title>Hello World</title>
<style>
body {
min-width: 100px;
overflow-x: hidden;
} img {
margin: 5px;
border: 2px solid black;
vertical-align: middle;
width: 75px;
height: 75px;
}
</style> <!--
- JavaScript and HTML must be in separate files: see our Content Security
- Policy documentation[1] for details and explanation.
-
- [1]: http://developer.chrome.com/extensions/contentSecurityPolicy.html
-->
</head>
<body>
<p id="p1">Hello World-1</p>
<p id="p2">Hello World-2</p>
<script src="popup.js"></script>
</body>
</html>

popup.html中有两个分别为p1和p2的标签,其中p1标签中原有的内容是Hello World-1,p2标签中原有的内容是Hello World-2。在popup.js中通过代码将标签1的内容修改为了Hello New World。

2.4 popup.js

document.getElementById("p1").innerHTML="Hello New World"

2.5 将插件安装到chrome浏览器中

2.5.1进入extension页面扩展程序

2.5.2勾选开发者模式

2.5.3将包含源码的目录直接拖入extension页面,完成安装。点击重新加载可以更新。

2.5.4运行,并看到了popup.html页面的正确显示且被popup.js所修改

三、通过backgroud javascript实现hello world!

目标:打开http://www.baidu.com/时,弹出hello world的提示框

3.1文件清单

3.2manifest.json文件

{
"manifest_version":2, "name":"one-click hello_world",
"description":"my first chrome extension-background",
"version":"1.0",
"permissions":[
"tabs",
"https://*/*",
"http://*/*"
],
"background": {
"scripts": ["bg.js"],
"persistent": false
}
}

permission字段中,新增“tabs”属性,后面需要通过tab来获得当前页面的url。background字段中指明了需要在后台运行的bg.js

3.3 bg.js

console.log("background")
chrome.tabs.onUpdated.addListener(function(tabId , info) {
if (info.status == "complete") {
chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
var url = tabs[0].url;
console.log(url)
if(url=="http://www.baidu.com/"){
chrome.tabs.executeScript(null,{code:'alert("Hello World!")'});
}
});
}
});

bg.js中注册了tabs的监听器,在当前页面加载完整之后检查当前页面链接是否是http://www.baidu.com/,并执行相应操作。

3.4 执行后的效果

四、通过page action实现hello world!

4.1 目标

访问http://www.baidu.com,在地址栏的右侧出现page action的图标,点击弹出html页面

4.2文件清单

4.3manifest.json

{
"manifest_version":2, "name":"one-click hello_world",
"description":"my first chrome extension-background",
"version":"1.0",
"permissions":[
"tabs",
"http://*/*"
],
"background": {
"scripts": ["bg.js"],
"persistent": false
},
"page_action": {
"default_name": "Hello world",
"default_icon": "marker.png",
"default_popup": "popup.html"
}
}

新增了page_action字段,指定了page action的图标和下拉html。

4.4 bg.js

console.log("background")
chrome.tabs.onUpdated.addListener(function(tabId , info) {
if (info.status == "complete") {
chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
var url = tabs[0].url;
console.log(url)
if(url=="http://www.baidu.com/"){
chrome.pageAction.show(tabs[0].id)
}
});
}
});

page action默认不做显示,当页面url=="http://www.baidu.com/",通过api chrome.pageAction.show显示page action

4.5 访问http://www.baidu.com,查看运行效果

4.6page action和browser action的对比

page action适用于插件仅针对少数页面的情况,browser action则主要适用于插件对大部分页面都有效的情况。就能够实现的功能而言是基本一致的。二者对比可以进一步参见[4]

六、参考材料

[1]Getting Started: Building a Chrome Extension - Google Chrome

[2]How can I get the URL for a Google Chrome tab? - Stack Overflow

[3]Chrome extensions : How to know when a tab has finished loading, from the background page - Stack Overflow

[4]chrome.pageAction - Google Chrome

[5]Sample Extensions - Google Chrome

chrome插件编写之新版hello world的更多相关文章

  1. chrome插件编写基本入门

    chrome插件编写基本入门  http://igeekbar.com/igeekbar/post/331.htm #精选JAVASCRIPTCHROME 作为一名程序猿,怎么能不会写chrome插件 ...

  2. 关于chrome插件编写的小结

    一个插件的大致目录结构如下: 其中manifest文件最为重要,它定义/指明插件应用的相关信息(权限.版本.功能说明等),点此查看Manifest的详情>>   这里有一篇chrome官方 ...

  3. Chrome 插件编写日记

    Chrome 插件,你可以理解为打开了一个网页,但是里面只有前端语言,JavaScript, HTML + css 但是有一点区别的是,它是有一个名字为 manifest.json 的配置文件的,里面 ...

  4. chrome插件编写中需要了解的几个概念和一些方法

    1.插件文件结构 1.1.manifest.json 每一个扩展.可安装的WebApp.皮肤,都有一个JSON格式的manifest文件,里面存放重要的插件相关信息. 一个最基本的配置例子: { &q ...

  5. 我的项目:一个chrome插件的诞生记,名字叫jumper

    选课是个问题,为了选课,便有了以下的故事. 最开始,萌生想法于2013年7月. 接着网上了解了chrome的结构知识,却发现例子是假的. 幸好有之前师兄的一个同功能插件开源,但代码写得很乱,我喜欢逻辑 ...

  6. 写个简单的chrome插件-京东商品历史价格查询

    说chrome插件编写的先关文章, 首推小茗的[干货]Chrome插件(扩展)开发全攻略. 有非常完善的理论,引用和demo代码. 但是还是建议看官方的 chrome extensions. chro ...

  7. 教你编写百度搜索广告过滤的chrome插件

    1 前言 目前百度搜索列表首页里,广告5条正常内容是10条,而且广告都是前1到5条的位置,与正常内容的显示样式无异.对于我们这样有能力的开发者,其实可以简单的实现一个chrome插件,在百度搜索页面里 ...

  8. chrome 浏览器插件开发(二)—— 通信 获取页面变量 编写chrome插件专用的库

    在chrome插件的开发过程中,我遇到了一些问题,在网上找了不少文章,可能是浏览器升级的原因,有一些是有效的也有无效的.下面我简单的分享一下我遇到的坑,以及我把这些坑的解决方案整理而成的js库 —— ...

  9. [chrome插件] 利滚利计算器 银行存款 基金理财 余额宝收益计算

    利滚利计算在数学上是否有一个简单的公式,我不知道,但作为程序员,这个算法实现起来就是小菜一碟.作为插件发布,是因为程序确实简单,也方便Chome浏览器使用者安装.如果你也想使用一下Chrome插件,参 ...

随机推荐

  1. Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...

  2. Label自适应高度

    每次都逼我翻代码   这次干脆写博客里面算了 哈哈哈 CGSize maxSize = CGSizeMake(ScreenWith-30,NSIntegerMax); CGSize labelsize ...

  3. 【读书笔记】iOS-ARC-不要向已经释放的对象发送消息

    一,在AppDelegate.m中写入如下代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...

  4. 【Android】不使用WebView来执行Javascript脚本(Rhino)

    前言 动态执行脚本能有效的降低重要功能硬编码带来的问题,尤其是依赖于第三方的应用,可以通过动态脚本+在线参数(例如友盟在线参数)再不更新应用的情况下升级功能. 声明 欢迎转载,但请保留文章原始出处:) ...

  5. 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法

    概述 在正常的使用场景中,我们处理了比较多的矩形区域内触摸事件,比如UIButton.UIControl.一般来说,这些控件的图形以及触摸区域都是矩形或者圆角矩形的.但是在一些特殊应用场景中我们有时不 ...

  6. Eclipse中Maven+Spring3.2.17+SpringMVC HelloWorld

    遇到的问题 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path ...

  7. art.dialog 返回提示

    <form  target="_top"  /> 1 如果加   target="_top" 提示跳出子页面 2 如果不加则在子页面提示

  8. 一组PHP可逆加密解密算法

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...

  9. MySQL锁问题

    MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎 采用的是表级锁:BDB存储引擎采用的是页面锁,但也支持表级锁:InnoDB存储引擎 ...

  10. mysql-5 数据检索(3)

    计算字段 如果想在一个字段中既显示公司的名称,又显示公司的地址,但是这两个信息一般包含在不同的表列中 城市.州和邮政编码存储在不同的列中,但是邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来 ...