自己做一款简易的chrome扩展--清除页面广告
大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球。
当然有现成的扩展程序或者插件(两者概念稍有不同)可以清除页面广告,但是既然身为一名程序猿,尤其是FEDer,为什么不尝试一下自己写一个清除广告的扩展程序呢。其实,编写一个浏览器扩展程序十分简单,尤其是chrome扩展,可以完全使用前端技术(HTML/CSS/JS)完成一个自己编写的扩展程序。让我们一步一步,学习一下如何编写一个简单的清除广告的扩展程序,跟烦人的页面广告say goodbye。
Chrome扩展程序介绍
首先,想明确的一点是,编写一个chrome扩展扩展程序并不难,入手也十分容易,大家不用觉得门槛特别高。
一个应用(扩展)其实是压缩在一起的一组文件,包括HTML,CSS,Javascript脚本,图片文件,还有其它任何需要的文件。 应用(扩展)本质上来说就是web页面,它们可以使用所有的浏览器提供的API,从XMLHttpRequest到JSON到HTML5全都有。
其实明白了这一点,那么我们的目的就很明确了,要做一个清除页面广告的扩展程序,核心就是编写一个脚本文件,注入到我们访问的页面中,通过匹配广告元素的DOM节点,将其干掉清除。
建立扩展目录:
每个扩展(extension)都应该包含下面的文件:
- 一个manifest文件
- 一个或多个html文件
- 可选的一个或多个javascript文件
- 可选的任何需要的其他文件,例如图片
- 扩展程序图标icon...
manifest.json:
我们的扩展目录需要创建的第一个文件是一个清单文件,包含了应用(扩展)的基本信息,如扩展名称、版本号,及最重要的文件列表,应用(扩展)所需要的权限等。从更高的层次来看,我们将使用它来向 Chrome 浏览器声明扩展程序将会做什么,以及为了完成这些任务所需要的权限:
{
"name": "清除页面广告",
"version": "2.0",
"manifest_version": 2,
"description": "简易制作的清除页面广告的chrome扩展程序",
"permissions": [
"http://*/"
],
"icons": {
"16": "icon-16-coco.png",
"128": "icon-128-coco.png"
},
"browser_action": {
"default_icon": "icon-16-coco.png",
"default_popup": "popup.html"
},
"content_scripts": [{
"matches": ["http://*/", "https://*/", "http://*/*", "https://*/*"],
"js": ["js/jquery-1.10.1.min.js", "js/my-del-ad-script.js"]
}]
}
接下来,将这一数据保存在名为 manifest.json
的文件中,放在您创建的目录中,或者 从我的github上拷贝整个项目用作示例。
图标与弹出页面:
在manifest.json中,有个名为browser_action的key,其中"default_icon"和"default_popup"指的是扩展将显示的图标以及popup.html页面。如果扩展配置及安装成功,就会如下图所示,其中在popup.html文件中的内容将显示在图中default_popup区域中。
content_srcipts:
popup.html是扩展当中非常有用页面,可以与使用者进行一个交互,不过在清除页面广告中并非主角。上面说的要向页面当中注入脚本文件,主要就是靠content_scripts,Content scripts是在Web页面内运行的javascript脚本。通过使用标准的DOM,它们可以获取浏览器所访问页面的详细信息,并可以修改这些信息。
下面是content scipt可以做的一些事情范例:
- 匹配页面中的DOM结点,并修改他们的样式
- 放大页面字体使文字更清晰
- 从页面中找到没有写成超链接形式的url,并将它们转成超链接。
- .......(所有你能想到的)
manifest.json中的content_scripts,有个"js"的key,扩展将会向所有匹配的页面,依次注入在"js"当中定义的页面,在本扩展程序中,就是依次注入了"js/jquery-1.10.1.min.js", "js/my-del-ad-script.js"两个文件,其中my-del-ad-script.js就是我们要清除页面广告的代码所在。
当上面的步骤你都看懂之后,后面的工作就是,编写简单的脚本,匹配页面当中的广告元素的DOM节点,然后将其清除(简单的利用JQ的.hide())。
编写脚本
现在,我们要做的就是分析一下页面当中,广告元素的DOM节点样式。
看看下面几张图:
通过观察发现,页面广告要不就是出现频率特别高的同类广告(两侧的页游推广),另一类是通过iframe内嵌到页面中的图片。第一类广告通常都拥有相同的ID属性,基本上是 id:#cproIframe2001~#cproIframe2008。而第二类广告通过选择器匹配,也能非常容易的定位到,譬如其中一种为$('div iframe').find('img')。
这样,我们就算是找到了定位到了这些广告的DOM节点,如何清除呢?其实很简单,我是直接将其display:none将其隐藏。清除清除,不一定要删除节点,眼不见就可以了。
(很多园友提议直接remove掉节点能更好提升性能。)
看看简单的JS代码(此段代码在my-del-ad-script.js中):
1 var clearAd = {
2 clear: function() {
3 //此处可手动添加广告框id名,去除顽疾ad必备
4 var ad_id_name = [
5 "cproIframe2001holder",
6 ...
7 "cproIframe2008holder",
8 ];
9
10 //此处添加广告框类名
11 var ad_css_name = [
12 "cproIframe_u410704_3",
13 ...,
14 "hover_btn"
15 ];
16
17 for (var i = 0; i < ad_id_name.length; i++) {
18 $('#' + ad_id_name[i]).hide();
19 }
20
21 for (var i = 0; i < ad_css_name.length; i++) {
22 $('.' + ad_css_name[i]).hide();
23 }
24 },
25 //简单的智能算法
26 findSomeAdPossible: function() {
27 var sap = $('div iframe'),
28 ad_img = $('div script').parent().find('img,embed'),
29 float_img = $('div object').parent().find('img,embed');
30
31 this.arrayDel(sap, 360, 200);
32 this.arrayDel(ad_img, 350, 150);
33 this.arrayDel(float_img, 350, 150);
34 },
35 arrayDel: function(arr, conWidth, conHeight) {
36 var len = arr.length;
37
38 for (var i = 0; i < len; i++) {
39 var self = arr.eq(i);
40
41 if (self.width() <= conWidth || self.height() <= conHeight) {
42 self.hide();
43 }
44
45 }
46 },
47 init: function() {
48 this.clear();
49 this.findSomeAdPossible();
50 }
51 }
当然,这里只是简单是示例如何找到广告并清除之,算法非常简单并不严谨(勿喷),而且会有几率误杀”良性页面“。有兴趣的朋友可以自行改写。
这样,一个简单的清除广告的扩展程序就编写好了,只要扩展正常安装,脚本将会被注入到所有匹配到的页面当中并发挥作用,看一下效果:
开启扩展前后:
如果想查看注入的脚本文件是否正常运行,我写了一句console,打开控制台查看,看到Clear Start则是脚本正常运行。
可以看到,广告全部被清除,但是可能误杀了一些有用的元素,JS代码可以更加精确改进。
更加精确的清除以及利用扩展实现更多的功能,赶紧动手试一下。
安装Chrome扩展
在您的浏览器中访问
chrome://extensions
(或者单击多功能框最右边的按钮: 打开 Chrome 浏览器菜单,并选择更多工具(L)菜单下的扩展程序(E),进入相同的页面)。确保右上角开发者模式复选框已选中。 Ensure that the Developer mode checkbox in the top right-hand corner is checked.
单击加载正在开发的扩展程序…,弹出文件选择对话框。
浏览至您的扩展程序文件所在的目录,并选定。
您也可以将扩展程序文件所在的目录拖放到浏览器中的 chrome://extensions
上加载它。如果扩展程序有效的话,它将被加载并且立刻处于活动状态!如果无效的话,页面顶部将显示错误消息,请纠正错误再重试。
后记:
感谢有读者提出指正 谷歌扩展程序 与 插件 的异同。
"扩展"和"插件",其实都是软件组件的一种形式,Chrome 只不过是把两种类型的组件分别给与了专有名称,一个叫"扩展",另一个叫"插件"。
- 扩展(Extension),指的是通过调用 Chrome 提供的 Chrome API 来扩展浏览器功能的一种组件,工作在浏览器层面,使用 HTML + Javascript 语言开发。比如著名的 Adblock plus。
- 插件(Plug-in),指的是通过调用 Webkit 内核 NPAPI 来扩展内核功能的一种组件,工作在内核层面,理论上可以用任何一种生成本地二进制程序的语言开发,比如 C/C++、Delphi 等。比如Flash player 插件,就属于这种类型。一般在网页中用 <object> 或者 <embed> 标签声明的部分,就要靠插件来渲染。
本文只是非常简单的介绍了chrome扩展,只是chrome扩展的冰山一角,使用chrome扩展可以实现更多你想象不到的功能,更多详情或者完整的API,请点击这里。
本文实例的完整的扩展(extension)代码在我的github上可以下载。
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
出处:http://www.cnblogs.com/coco1s/p/4725477.html
自己做一款简易的chrome扩展--清除页面广告的更多相关文章
- 清除页面广告?身为前端,自己做一款简易的chrome扩展吧
大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...
- Chrome浏览器清除页面js文件缓存的方法
Chrome浏览器清除页面js文件缓存 Chrome浏览器清除js缓存方法虽然简单,但有些人还是不太会,有些人会去设置里面清除有时候没有用,这里写一下简单步骤,使用一次以后就会了,而且速度更快 1.打 ...
- 一起来做chrome扩展《页面右键菜单》
本文主要内容 contextMenus的设置 打开权限 创建菜单 点击菜单 background script向content script发送消息 1. contextMenus的设置 1.1 打开 ...
- Chrome扩展修改页面代码执行环境的方法
Chrome的扩展程序可以通过content scripts向页面中注入js代码,所注入的js代码能够对页面中所有的DOM对象进行操作.由于Chrome在js执行环境上对页面代码和content sc ...
- 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- chrome扩展安装图文教程
众所周知chrome的各类插件,扩展很丰富,也有很多经典的应用.但是谷歌经常被墙,无法访问,想要通过访问谷歌的应用市场来直接安装浏览器扩展会比较让人抓狂,好不容易无数次刷新后打开了页面,找到了想要的应 ...
- 安装Chrome扩展程序xpath
最近工作用到xpath,直接从浏览器复制下来路径时常会出错而且长度很长,于是我想到之前用过的一款chrome插件,可以直接编写xpath语句,并实时出现解析出的结果,检验xpath语句是否编写正确.效 ...
- 如何将已经安装从chrome扩展程序导出备份为.CRX文件?
之前介绍过CRX Extractor可以从chrome应用商店下载备份扩展程序,有读者朋友问说:如果 Google Chrome扩展程序已经从 Chrome应用商店下架,还有没有方法下载呢?通常网路上 ...
随机推荐
- 不小心踩到的XMAPP的N种问题
1.在win10上的xampp集成环境中安装mongo扩展 按照网上搜索的下载对应文件后,在phpinfo里面还是找不到mongo的扩展信息,后面也是请教同事帮忙解决: http://www.theg ...
- 织梦ckeditor编辑器 通过修改js去除img标签内的width和height样式
1. 文件\include\ckeditor\plugins\image\dialogs\image.js 2. 使用工具美化js代码 3. 搜索 setStyle('width', CKEDITOR ...
- 【虚拟机-远程链接】Azure Windows 虚拟机常见导致无法远程的操作
对Azure虚拟机的一些操作可能会导致无法远程连接,本文罗列了以下导致不能远程连接的场景: 场景1 - 在虚拟机网卡配置中配置IP地址或MAC地址 场景2 - 远程桌面授权过期 场景3 - 误设置“不 ...
- Redis相关注意事项
本文介绍了五个使用Redis使用时的注意事项.如果你在使用或者考虑使用Redis,你可以学习一下下面的一些建议,避免遇到以下提到的问题. 一.配置相关注意事项 1.涉及到内存的单位注意添加 b 1k ...
- Python 继承实现的原理(继承顺序)
继承顺序 Python3 : 新式类的查找顺序:广度优先 新式类的继承: class A(object): Python2 3 都是了 MRO算法--生成一个列表保存继承顺序表 不找到底部 Pytho ...
- 树莓派 - 修改pi账号密码,开启root账号
1.修改PI账号的密码 password pi 2.开启root账号 树莓派使用的Linux是debian系统,所以树莓派启用root和debian是相同的. debian里root账户默认没有密码, ...
- c#中的自定义泛型类、泛型方法和泛型接口
泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题: 一.泛型类: /// <summary> /// 返回前台的消息 /// </summary> ...
- Java的日期类和日期格式化类
日期类: Date date = new Date(); // 获取当前的系统时间 2 System.out.println("年份:"+ date.getYear()); Cal ...
- js菜鸟备忘
1.图片切换 function changeImage() { var img = document.getElementById("myImg"); ")) img.s ...
- 01_2_模拟spring装载bean
01_2_模拟spring装载bean 1. xml配置文件内容 beans.xml <beans> <bean id="u" class="com.w ...