美文网首页PHP经验分享程序员工具癖
【轻知识】chrome扩展开发——不智能过滤广告

【轻知识】chrome扩展开发——不智能过滤广告

作者: 言十年 | 来源:发表于2018-12-13 00:53 被阅读114次

先看看效果

  • 设置前
设置前
  • 设置后
设置后
  • 规则


    规则
  • 面板解读

直接看json 就晓得界面功能了。

iframe 轮播广告
.pulllog-box 底部广告
#csdn-toolbar 顶部tabbar
aside 隐藏侧栏就没必要再添加iframe了
{
    "blog.csdn.net":[
        {
            "is_enable":1,
            "rule":"iframe"
        },
        {
            "is_enable":1,
            "rule":".pulllog-box"
        },
        {
            "is_enable":1,
            "rule":"#csdn-toolbar"
        },
        {
            "is_enable":1,
            "rule":"aside"
        }
    ]
}

开发动机

查资料的时候,经常会看到一些广告。会分神。比如:百度右侧广告、CSDN的广告(还是轮播的)等等。

其实我们查资料,固定访问的域名很多时候都是高频的。因为,有自己独立域名的童鞋还是少数(更少的是投广告在自己博客上,比如:阮一峰、廖雪峰 等等)

我们看一些自我比较难的知识点(比如:底层知识)本来就看的慢。轮播广告晃来晃去。心烦,还是双十一促销广告。上一秒思考网络事件模型,下一秒想买个降噪耳机吧。开个玩笑。

拿来主义

我看了这篇文章《【干货】Chrome插件(扩展)开发全攻略》(文末有链接)。作者把自己的作品放了github。

我想快速搞定.....。那么我需要知道插件开发规则(比如:所谓搭建个架子)。比如你要用一个框架写业务。正好兄弟部门有人用过,那么down 他一份。因为我仅仅需要个架子跟一个mvc demo。

于是,我down 了上文文中作者github的demo。

第一版完成

进一步畅想

联网弄个远程规则库?每个人都弄个账号保存自己的规则?这样换电脑就不用再手动了。再增加一些程序员经常用的小工具?

鼠标划区域屏蔽?

..........(省略的想象)........

其实:adblock 扩展就很智能(支持划区域屏蔽)。推荐给大家https://chrome.google.com/webstore/search/adblock?hl=zh-CN

代码

页面加载完根据规则做dom remove

$(function() {
    var u = new URL(location.href);
    host = u.hostname;// 获取host
    // 加载设置
    chrome.storage.sync.get(host, function(data) {
        var eleArr = data[host]; // 获取要删除的元素数组
        if (data[host] != undefined) {
            eleArr.forEach(function(v,k) {
                    console.log(v);
                if (v.is_enable === 1) {
                    $(v.rule).remove();
                }
            })
        }
    });
});

界面操作

var ruleObj = {
    host: '',
    ruleData: [],
    alreadyDiv: $("#already"),
    msg: '操作成功!',
    init: function() {
        var that = this;
        chrome.tabs.getSelected(null, function (tab) {
            var u = new URL(tab.url);
            that.host = u.hostname;// 获取host
            // 因为是异步 所以要放这里边。
            chrome.storage.sync.get(that.host, function(data) {
                 if (data[that.host] != undefined) {
                    var eleArr = data[that.host]; // 获取要删除的元素数组
                    that.ruleData = eleArr;
                    that.render(); // 渲染数据
                 }
            });
        });
    },
    saveData: function() {
        var that = this;
        var obj = {};
        obj[that.host] = that.ruleData;
        chrome.storage.sync.set(obj, function() {
            var statusSpan = $("#status");
            statusSpan.html(that.msg);
            setTimeout(() => {statusSpan.html('');}, 800);
            pageObj.refresh();
        });
    },
    reloadRender: function() {
        this.alreadyDiv.empty();
        this.render();
    },
    render: function() {
        var that = this;
        this.ruleData.forEach(function(v,k) {
            var statusDesc = v.is_enable == 0 ? "启用": "禁用";
            that.alreadyDiv.append("<p><input type='text' id='rule"+k+"' value='"+v.rule+"' /><button class='update' data-index='"+k+"'>更新</button><button class='delete' data-index='"+k+"'>删除</button><button class='is_enable' data-index='"+k+"'>"+statusDesc+"</button></p>");
        })
    }
};
var pageObj = {
    refresh: function() {
        chrome.tabs.getSelected(null, function(tab) {
          var code = 'window.location.reload();';
          chrome.tabs.executeScript(tab.id, {code: code});
        });
    }
}

ruleObj.init();
ruleObj.render();

$("#already").on("click", ".update", e => {
    var index = $(e.target).data("index");
    var rule = $("#rule"+index).val();
    if (rule.length == 0) {
        return false;
    }
    ruleObj.ruleData[index].rule = rule;
    ruleObj.saveData(); 

})
$("#already").on("click", ".delete", e => {
    var index = $(e.target).data("index");
    ruleObj.ruleData.splice(index, 1);
    ruleObj.reloadRender()
    ruleObj.saveData();
})

$("#already").on("click", ".is_enable", e => {
    var index = $(e.target).data("index");
    var rule = $("#rule"+index).val();
    if (rule.length == 0) {
        return false;
    }
    ruleObj.ruleData[index].is_enable = ruleObj.ruleData[index].is_enable ? 0 : 1;
    ruleObj.saveData(); 
})

$("#add").click(e => {
    var rule = $("#rule").val();
    if (rule.length == 0) {
        return false;
    }
    $("#rule").val('');
    var ruleJson = {
        rule: rule,
        is_enable: 1
    }
    ruleObj.ruleData.push(ruleJson);
    ruleObj.reloadRender();
    ruleObj.saveData()
});

demo下载 https://github.com/yanshinian/adblock-chrome

插件icon

icon

参考资料:

*《【干货】Chrome插件(扩展)开发全攻略》http://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html#%E5%BC%80%E5%8F%91%E4%B8%8E%E8%B0%83%E8%AF%95

*《Chrome插件(Extensions)开发攻略》 https://www.cnblogs.com/guogangj/p/3235703.html

相关文章

网友评论

    本文标题:【轻知识】chrome扩展开发——不智能过滤广告

    本文链接:https://www.haomeiwen.com/subject/vjvphqtx.html