chrome插件开发中的options页,就是插件的设置页面,有2个入口,一个是右键图标有一个“选项”菜单,还有一个在插件管理页面:


要想在插件中开启这个功能需要在配置页中进行配置,浏览器版本不同,配置的方法也不同

manifest.json

// Chrome40以前的插件配置页写法
"options_page": "options.html",
// Chrome40以后的插件配置页写法,如果2个都写,新版Chrome只认后面这一个
"options_ui":
{"page": "options.html",// 添加一些默认的样式,推荐使用"chrome_style": true
},

此时,我们创建一个options.html后,就有了一个options页面,可以在右击图标或者在插件详情页中开启该选项页了

假设我需要实现一个功能,在选项页中能够对页面的文字格式进行更改,就需要options发出请求给content_script.js,与content_script.js进行通信。

但是我发现options不能直接和content_script页面进行通信,因为content_script并不在当前开启的页面中,所以我们需要一个中间载体,background,background可以理解和popup一样,只是popup页面只有在点击图标的时候才会触发出来,否则是不会开启的,而background则是一直在后台运行的。

开启background也需要在manifest.json中进行配置

"background":{// 2种指定方式,如果指定JS,那么会自动生成一个背景页。选其中一个即可,如果都开启会报错// "page": "background.html","scripts": ["js/background.js"]},

options.html

<!DOCTYPE html>
<html><head><style type="text/css">body{border-top: 1px solid #000;}button{width: 63px;}</style><meta charset="utf-8" /></head><body><div><p>设置微信文章页文字大小</p><button class="change_px12">12px</button><button class="change_px14">14px</button><button class="change_px16">16px</button><button class="change_px18">18px</button></div><script src="js/jquery-3.3.1.min.js"></script><script src="js/options.js"></script></body>
</html>

options.js

var windows = chrome.extension.getViews();
for (var extensionWindow of windows) {if (extensionWindow.location.pathname === "/_generated_background_page.html") {$(".change_px12").click(function () {var page = chrome.extension.getBackgroundPage();page.change_px12(); })$(".change_px14").click(function () {var page = chrome.extension.getBackgroundPage();page.change_px14(); })$(".change_px16").click(function () {var page = chrome.extension.getBackgroundPage();page.change_px16(); })$(".change_px18").click(function () {var page = chrome.extension.getBackgroundPage();page.change_px18(); })}
}

现在我们通过background这个载体来进行通信,在background中去监听options中的点击事件,如果点击了,则发送请求给content_script,让content_script进行处理,成功后将结果返回给background。

background.js

function sendMessageToContentScript(message, callback)
{//这里的url填写要操作的页面,我是要操作的微信文章页chrome.tabs.query({url: "*://*.weixin.qq.com/*"}, function(tabs){chrome.tabs.sendMessage(tabs[0].id, message, function(response){if(callback) callback(response);});});
}
function change_px12() {sendMessageToContentScript({cmd:'change_px12', value:'Change px to 12 start!'}, function(response){console.log('来自content的回复:'+response);});
}
function change_px14() {sendMessageToContentScript({cmd:'change_px14', value:'Change px to 14 start!'}, function(response){console.log('来自content的回复:'+response);});
}
function change_px16() {sendMessageToContentScript({cmd:'change_px16', value:'Change px to 16 start!'}, function(response){console.log('来自content的回复:'+response);});
}
function change_px18() {sendMessageToContentScript({cmd:'change_px18', value:'Change px to 18 start!'}, function(response){console.log('来自content的回复:'+response);});
}

content_script.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{var tag_name = document.getElementById("js_content").childNodes;if(request.cmd == 'change_px12'){for (var i = 0; i < tag_name.length; i++) {if (tag_name[i].nodeName == "P") {if (tag_name[i].firstElementChild) {if (tag_name[i].firstElementChild.nodeName == "SPAN") {tag_name[i].firstElementChild.setAttribute('style', 'font-size:12px');}}}}sendResponse('change px to 12 over !');}if(request.cmd == 'change_px14'){for (var i = 0; i < tag_name.length; i++) {if (tag_name[i].nodeName == "P") {if (tag_name[i].firstElementChild) {if (tag_name[i].firstElementChild.nodeName == "SPAN") {tag_name[i].firstElementChild.setAttribute('style', 'font-size:14px');}}}}sendResponse('change px to 14 over !');}if(request.cmd == 'change_px16'){for (var i = 0; i < tag_name.length; i++) {if (tag_name[i].nodeName == "P") {if (tag_name[i].firstElementChild) {if (tag_name[i].firstElementChild.nodeName == "SPAN") {tag_name[i].firstElementChild.setAttribute('style', 'font-size:16px');}}}}sendResponse('change px to 16 over !');}if(request.cmd == 'change_px18'){for (var i = 0; i < tag_name.length; i++) {if (tag_name[i].nodeName == "P") {if (tag_name[i].firstElementChild) {if (tag_name[i].firstElementChild.nodeName == "SPAN") {tag_name[i].firstElementChild.setAttribute('style', 'font-size:18px');}}}}sendResponse('change px to 18 over !');}
});

chrome插件开发——option(选项页)的通信相关推荐

  1. Chrome 插件开发-右键菜单开发实战演示,浏览器页面右键菜单选项设置,插件右键菜单点击插件名跳转主页设置

    Chrome 插件开发 - 菜单选项 浏览器页面右键菜单选项设置 ① 核心代码演示 ② 效果展示 ③ 详细参数文档 插件右键菜单点击插件名跳转主页设置 ① 核心代码演示 ② 演示效果图 浏览器页面右键 ...

  2. chrome插件开发(转)

    作者原文:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写 ...

  3. 十分钟带你入门Chrome插件开发

    一.简述 我们所说的chrome插件一般都是指chrome扩展程序(Chrome Extension).chrome插件是一个用Web技术开发.用来增强浏览器功能的软件,它其实就是一个由HTML.CS ...

  4. Chrome 插件开发小记

    文章目录 前言 manifest.json 常用配置项 常用API 脚本注入 网站与插件通信 网站端 插件端 打包 .crx QA 其他参考链接 前言 群里闲逛,看见有人发了个图,感觉还挺有意思,抽空 ...

  5. vue.js 初体验— Chrome 插件开发实录

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:陈纬杰 背景 对于经常和动画开发打交道的开发者对于Animate.css这个动画库不会陌生,它把一些常见 ...

  6. HTML实现选择数据库字段,django项目中在后台获取了数据库的某一列,如何将其显示在html模板中的select标签内的option选项下?...

    问题描述 不好意的整序大作站对近从体的家为宽应近从体的家思,本人是一个初学者,在尝试用django制作网站的时候遇到了一个问题,网上搜索了很久,苦于没有答案,想请教一下.想要实现的是在前端html里有 ...

  7. Chrome插件开发-右键菜单开启页面编辑

    开发一个执行js脚本改变页面DOM的Chrome插件,manifest_version版本为3. Chrome插件基本知识 Chrome插件通常由以下几部分组成: manifest.json 该文件为 ...

  8. Chrome插件开发实例---刷论坛在线时间小程序

    前记: 由于近日注册了某个技术论坛,其论坛要求转为正式会员必须50积分购买邀请号,回答官方预留的题目可以获得30积分,每日在线一小时可以获得1积分上限为5积分.本人回答了官方题目获得30积分,之后就只 ...

  9. 【Chrome插件开发】ReRes和request-interceptor源码赏析+复现+插件开发完整解决方案

    文章目录 引言 亮点 Chrome插件ReRes源码赏析 Chrome插件request-interceptor background.js源码赏析 技术选型 配置stylelint vscode配置 ...

  10. chrome 插件开发各种功能demo_Chrome 插件开发全攻略

    Chrome 浏览器相信大家都用得比较多,有很多的优点,比如简洁.强大的开发者工具等,但是更让大家映像深刻的是有各种各样有趣.有用的插件,今天要给大家推荐的开源项目是 Chrome 插件开发全攻略,你 ...

最新文章

  1. Qt最新版5.12在Windows环境静态编译安装和部署的完整过程(VS2017)
  2. 里海水位上升的原因_汽轮机真空下降的原因及处理
  3. MVC--Razor(1)
  4. 区块链是什么?白话解读入门必须了解的概念
  5. linux支持中文文件名,CentOS安装中文支持(linux中文文件名乱码)
  6. vba 判断文本框内容是否为空_校验数据一旦失败,VBA代码自动控制焦点返回的另一备选方案...
  7. 2336: [HNOI2011]任务调度 - BZOJ
  8. UVA654 LA5508 POJ1079 Ratio【暴力】
  9. matlab产生pn序列,[求助]PN序列的产生
  10. 宇视摄像机如何快速计算存储容量?
  11. 苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax、iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max、屏幕适配
  12. Linux基础内容介绍
  13. 关于路由器花生壳动态域名无法连接的解决方法
  14. 什么是DOM0,DOM2,DOM3?
  15. Rocketmq 消息的同步发送,异步发送,oneway方式
  16. 关于内推、简历、面试,我有一些想说的
  17. 这个企业邮箱登陆入口更快捷
  18. 浙大版《Python 程序设计》题目集
  19. 使用word写论文必备技巧(设置目录,目录导航)
  20. win10桌面右键卡顿卡死解决方法

热门文章

  1. java开源知识库项目_18个java cms开源项目
  2. java截取视频的帧
  3. 使用easyos递归删除城通网盘的日志
  4. 输入表重建工具ImportREC
  5. 计算机物理仿真,仿真物理实验室初中完整版
  6. VM虚拟机同步.4开同步教程MouseWithoutBorders无界鼠标安装配置教程
  7. 转自博客园好文---关于程序员今后的道路规划,借鉴并勉励一下
  8. 第二章 基于QT和DCMTK的Dicom 图像浏览器---界面设计
  9. 人机大战历程————思考与反思
  10. 人工智能电力行业应用,人工智能的需求分析