后记:在写这篇文章时,我还没搞懂chrome扩展的基本原理。后来才明白,最简单(且实用)的扩展只需要manifest.json和content_scripts.js两个文件,无需background.js等。content_scripts中的代码会按照manifest.json中指定的匹配网址(matches)和运行时间(run_at)来执行,从而对网页的DOM进行操作。而且为了方便,还可以在manifest.json中引入jquery进行操作。可参考下一篇文章。

环境:win7+chrome77

1、新建目录,名为hellocrx    ;其中,新建文件manifest.json,内容为:

{
"manifest_version": ,
"name": "hellocrx",
"version": "1.0.0",
"description": "crx入门学习",
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["mycontent.js"],
"run_at": "document_end",
"all_frames": true
}
],
"permissions": [
"bookmarks", "http://*/*", "https://*/*"
]
}

再新一建一个空的文件,名为:mycontent.js

好了,chrome扩展已经完成了。现在:

(1)访问:chrome://extensions/

(2)打开“开发者模式”开关,点击“加载已解压的扩展程序,选择您所建立的hellocrx目录。

hellocrx扩展已经出现在url地址栏右侧了,点击扩展图标会有弹出菜单。可以关闭开发者模式了。

2、为了实现交互,现在给chrome浏览器增加右键菜单

(1)修改manifest.json中permissions字段为:

  "permissions": [
"bookmarks", "http://*/*", "https://*/*","contextMenus","tabs"
]

与manifest_version字段平级增加background字段:

    "background":
{
// 2种指定方式,如果指定JS,那么会自动生成一个背景页
//"page": "background.html"
"scripts": ["background.js"]
},

(2) background.js内容为:

chrome.contextMenus.create({
title: "测试右键菜单",
onclick: function(){alert('您点击了右键菜单!');}
});

(3)注意保存文件,然后打开chrome://extensions/

点击hellocrx扩展上的刷新图标,重新加载扩展。(注意:如果您修改的是chrome扩展的manifest.json配置项,一定要在chrome的扩展管理中删除当前扩展 然后重新加载才行。更新是没有用的)

此时,在网页上点鼠标右键,将弹出提示。但是中文是乱码(我想解决办法应该是自己写background.html,指定页面编码。我想这也说明此时脚本运行在background页面中的。)

3、background(以及popup)中无法直接访问页面DOM。就需要用到有权限与网页交互的content_scripts到,也就是我们在manifest.json中指定的mycontent.js。

(1)修改background.js,使得点击右键时调用mycontent.js,以便操作DOM

chrome.contextMenus.create({
title: "测试右键菜单",
});
// "activeTab" permission is sufficient for this:
chrome.contextMenus.onClicked.addListener(function(info, tab){
chrome.tabs.executeScript(tab.id, {file: "mycontent.js"})
});

(2)修改mycontent.js内容如下:

document.body.style.backgroundColor="black";

重新加载插件,在页面上点右键菜单,发现页面背景变成黑色了。

(这里有个问题:重新刷新网页后,背景还是黑色。解决办法是关闭插件后再刷新。)

4、为了更方便调试查看操作效果,还是不用右键菜单了。改为直接点击插件来执行mycontent.js

即让background页和content页实现相互通信

(1)manifest.json

{
"manifest_version": ,
"name": "hellocrx",
"version": "1.0.0",
"description": "crx入门学习",
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["mycontent.js"],
"run_at": "document_end",
"all_frames": true
}
],
"background":
{
"scripts": ["background.js"]
},
"browser_action": {
"default_title": "mycrx测试"
},
"permissions": [
"bookmarks", "http://*/*", "https://*/*","contextMenus","tabs","activeTab"
]
}

(2)background.js

chrome.browserAction.onClicked.addListener(function(tab) {
// No tabs or host permissions needed!
console.log('Turning ' + tab.url + ' green!');
alert("crx was clicked and url is:" + tab.url);
chrome.tabs.query(
{active: true, currentWindow: true},
function(tabs) {
chrome.tabs.sendMessage(
tabs[].id,
{greeting: "hello"},
function(response) {
console.log(response.farewell);
});
});
});

(3)mycontent.js:

alert("mycontent start run");
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting == "hello")//判断是否为要处理的消息
sendResponse({farewell: "goodbye"});
//访问页面的DOM
document.body.style.backgroundColor="green";
document.getElementById("kw").value="crx"
});

删除插件,重新从源文件目录加载。

效果是:a. 打开网页时,会弹窗显示"mycontent start run"。

b.点击地址栏右侧的插件图标,会弹窗显示"crx was clicked and url is……"。 并且网页背景变成绿色(有的网页可能看不清)

c.打开背景变绿的网页的console,会看到“from the extension”

d.在chrome://extensions/打开hellocrx的背景页,会看到“goodbye”

e.如果是在百度的搜索页面,还会自动在搜索框内写入“crx”

这样,就实现了点击扩展图标,执行background页中的JS,向Content页发消息;然后Content页接到消息,去操作DOM。

然而,注意一个bug:

重新加载扩展后,要刷新已打开的网页,才能再次点击扩展图标,否则扩展会出现错误。在chrome://extensions/页点击扩展图标也会出错。

修改代码后,测试扩展的正确方法是:每次刷新先网页,后击扩展图标执行。

参考:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html

http://open.chrome.360.cn/extension_dev/windows.html#apiReference

http://www.ptbird.cn/category/chrome-extensions/

https://www.cnblogs.com/he-bo/p/9963540.html

https://www.cnblogs.com/champagne/p/4848520.html

以及我之前写的https://www.cnblogs.com/pu369/p/6381560.html

chrome扩展开发实战入门之一-hellocrx的更多相关文章

  1. chrome扩展开发实战入门之二-自动搜索

    目标:产生随机数,用于百度搜索:像看电视一样观看搜索结果 参考上一篇,新建目录hellocrx,其中三个文件:manifest.json  content_script.js 和jquery-3.4. ...

  2. chrome拓展开发实战:页面脚本的拦截注入

    原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...

  3. chrome拓展开发实战

    chrome拓展开发实战:页面脚本的拦截注入 时间 2015-07-24 11:15:00  博客园精华区 原文  http://www.cnblogs.com/horve/p/4672890.htm ...

  4. 《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

  5. 【转发】NPAPI学习(Firefox和Chrome扩展开发 )

    NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...

  6. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  7. Chrome扩展开发(Gmail附件管理助手)系列之〇——概述

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  8. Chrome扩展开发之一——Chrome扩展的文件结构

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  9. Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

随机推荐

  1. windons下一些软件的地址

    idea http://download.jetbrains.8686c.com/idea/ideaIC-2018.3.1.exe

  2. spring中使用动态代理(AOP)

    spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; ...

  3. C#获取Excel表格所有sheet名(Epplus)

    原文:C#获取Excel表格所有sheet名(Epplus) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  4. Ubuntu 14.04 用户如何安装深度音乐播放器和百度音乐插件

    播放本地音乐或者收听国外的音乐电台,Ubuntu 14.04 自带的音乐播放器 Rhythmbox 完全能够满足,但是如果你想有像酷狗那样的国内播放器就需要折腾一下,还好有深度音乐播放器,这是一款完全 ...

  5. 货币转换C

    描述 人民币和美元是世界上通用的两种货币之一,写一个程序进行货币间币值转换,其中:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮ ...

  6. JS数组抽奖程序教学实例

    数组Javascript中非常重要的知识点,为了在课堂上提高学生兴趣,教学举例的选择就比较重要了. 为了提高学生兴趣,特设计一个可输入,可控制结束的,利用JS数组实现的抽奖教学实例.代码如下:

  7. vscode-golang跳转定义无效问题

    问题发现: 本来可以进行"ctrl"+点击或者F12,进行跳转定义的方式,突然失效了 问题分析: 1.辅助工具是否关闭 解决方案,进入首选项,设置,查找go.docsTool,选项 ...

  8. 【Distributed】网站跨域解决方案

    一.概述 1.1 什么是网站跨域 1.2 网站跨域报错案例 二.五种网站跨域解决方案 三.使用JSONP解决网站跨域[1] 3.1 前端代码 3.2 后端代码 四.使用设置响应头允许跨域[2] 4.1 ...

  9. Ceph 调整crush map

    目录 Ceph 调整crush map 1.前言 2.示例 1.创建新的replicated 2.修改当前pool的rule Ceph 调整crush map 1.前言 本文章适用于ceph n版 2 ...

  10. 【Day4】5.Request对象之Http Post请求案例分析

    import urllib.parse as up import urllib.request as ur import json word = input('请输入要翻译的中文') data = { ...