zoukankan      html  css  js  c++  java
  • Chrome插件开发(四)

    在前面我们编写了三个比较实用的插件,在实际工作中,我们还会使用很多其他的插件,比如掘金,Pocket之类的,我们可能需要经常启用或禁用插件或者删除插件,如果每次都要点到更多工具->扩展程序中去做这些操作,会相当烦躁,本节我们将实现一个可以方便管理插件的插件,我们先看看插件运行的截图:

    插件实现了对其他插件的启用/禁用/移除等功能,下面我们来说一下如何实现这个插件。

    老规矩,在正式开始编写之前,我们先了解一下需要使用到的API:

    1、chrome.management.getAll 返回所有已安装的扩展

    2、chrome.management.get 根据ID获取某一个插件的详细信息

    3、chrome.management.setEnabled 启用/禁用一个插件

    4、chrome.management.uninstall 从已经安装列表中移除一个插件

    关于chrome.management相关API的使用方法,可以参考:http://open.chrome.360.cn/extension_dev/management.html

    由于我们使用了chrome.management相关API,所以我们需要在manifest.json文件中申请management权限。

    接下来我们就开始编写插件,首先我们需要渲染出插件列表,当然要排除自身,不然一不小心禁用或移除了自身,那还管理个毛,我们这里通过插件的name来排除自身,首先我们先定义两个变量:

    1 var $list = $('#list');
    2 var currentExtensionName = 'ExtensionManagement';

    $list是渲染的容器节点,currentExtensionName定义的当前插件的名称,接下来,我们获取所有安装的插件排除自身并将其他的渲染出其他插件。

     1 chrome.management.getAll(function(eInfo){
     2   var list = eInfo.map(function(ex) {
     3     if (ex.name === currentExtensionName) {
     4     return '';
     5   }
     6   var activeClass = ex.enabled ? 'fa-times' : 'fa-check';
     7   return '<li id="' + ex.id + '"><a href="' + 'javascript:void(0)" title="' + ex.shortName + '">' + ex.shortName + '</a><div class="icons"><span class="fa able ' + activeClass + '"></span><span class="fa trash fa-trash-o"></span></div></li>';
     8   });
     9   $list.html(list.join(''));
    10 });

    现在我们已经将插件渲染到了页面中,并按照其状态添加了启用/禁用/移除等链接,接下来我们就需要实现启用/禁用/移除等功能了。

     1 $list.on('click', '.able', function() {
     2   var _this = $(this),
     3     _id = _this.parents('li').attr('id');
     4   chrome.management.get(_id, function(eInfo) {
     5     if (eInfo.enabled) {
     6       chrome.management.setEnabled(_id, false, function() {
     7       _this.removeClass('fa-times').addClass('fa-check');
     8       });
     9     } else {
    10       chrome.management.setEnabled(_id, true, function() {
    11       _this.removeClass('fa-check').addClass('fa-times');
    12       });
    13     }
    14   });
    15 });
    16  
    17 $list.on('click', 'a', function() {
    18   var _this = $(this),
    19     _li = _this.parents('li'),
    20     _able = _li.find('.able'),
    21     _id = _li.attr('id');
    22   chrome.management.get(_id, function(eInfo) {
    23     if (eInfo.enabled) {
    24       chrome.management.setEnabled(_id, false, function() {
    25       _able.removeClass('fa-times').addClass('fa-check');
    26       });
    27     } else {
    28       chrome.management.setEnabled(_id, true, function() {
    29       _able.removeClass('fa-check').addClass('fa-times');
    30       });
    31     }
    32   });
    33 });
    34  
    35 $list.on('click', '.trash', function() {
    36   var _this = $(this),
    37     _li = _this.parents('li'),
    38     _id = _li.attr('id');
    39   chrome.management.uninstall(_id, function() {
    40     if (chrome.runtime.lastError) {
    41       console.log(chrome.runtime.lastError.message);
    42     } else {
    43       _li.fadeOut('normal', function() {
    44         _li.remove();
    45       });
    46     }
    47   });
    48 });

    上面就是我们如何实现的思路,接下来看一下目录结构:

     核心mainfest.json代码

     1 {
     2     "name" : "ExtensionManagement",
     3     "version" : "1.0",
     4     "description" : "管理chrome扩展",
     5     "manifest_version" : 2,
     6     "icons": {
     7         "16": "images/ico-48.png",
     8         "48": "images/ico-48.png",
     9         "128": "images/ico-48.png"
    10     },
    11     "permissions" : ["management", "https://*/*","http://*/*"],
    12     "browser_action" : {
    13     "default_popup" : "popup.html"
    14     }
    15 }

    popup.html 代码

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <title>扩展管理页</title>
     5     <link rel="stylesheet" type="text/css" href="css/style.css">
     6     <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
     7 </head>
     8 <body>
     9 <ul id="list"></ul>
    10 <script type="text/javascript" src="js/jquery.min.js"></script>
    11 <script type="text/javascript" src="js/popup.js"></script>
    12 </body>
    13 </html>

    style.css 代码

     1 #list {
     2     padding: 0;
     3     margin: 0;
     4     list-style-type: none;
     5     font-family: 'Microsoft Yahei';
     6     padding: 0 15px;
     7     font-size: 16px;
     8 }
     9 
    10 #list li {
    11     height: 32px;
    12     width: 250px;
    13     line-height: 32px;
    14     border-bottom: 1px dashed #eee;
    15 }
    16 
    17 #list li a {
    18     color: #000;
    19     text-decoration: none;
    20     white-space: nowrap;
    21     overflow: hidden;
    22     text-overflow: ellipsis;
    23     width: 80%;
    24     float: left;
    25 }
    26 
    27 #list li .icons {
    28     float: right;
    29 }
    30 
    31 #list li .icons span {
    32     margin-left: 10px;
    33     cursor: pointer;
    34 }
    35 
    36 #list li .icons span.fa-times {
    37     color: #f00;
    38 }
    39 
    40 #list li .icons span.fa-check {
    41     color: #0f0;
    42 }

    popup.js 代码

     1 var $list = $('#list');
     2 var currentExtensionName = 'ExtensionManagement';
     3 
     4 chrome.management.getAll(function (eInfo) {
     5     var list = eInfo.map(function (ex) {
     6         if (ex.name === currentExtensionName) {
     7             return '';
     8         }
     9         var activeClass = ex.enabled ? 'fa-times' : 'fa-check';
    10         return '<li id="' + ex.id + '"><a href="' + 'javascript:void(0)" title="' + ex.shortName + '">' + ex.shortName + '</a><div class="icons"><span class="fa able ' + activeClass + '"></span><span class="fa trash fa-trash-o"></span></div></li>';
    11     });
    12     renderList(list);
    13 });
    14 
    15 $list.on('click', '.able', function () {
    16     var _this = $(this),
    17         _id = _this.parents('li').attr('id');
    18     chrome.management.get(_id, function (eInfo) {
    19         if (eInfo.enabled) {
    20             chrome.management.setEnabled(_id, false, function () {
    21                 _this.removeClass('fa-times').addClass('fa-check');
    22             });
    23         } else {
    24             chrome.management.setEnabled(_id, true, function () {
    25                 _this.removeClass('fa-check').addClass('fa-times');
    26             });
    27         }
    28     });
    29 });
    30 
    31 $list.on('click', 'a', function () {
    32     var _this = $(this),
    33         _li = _this.parents('li'),
    34         _able = _li.find('.able'),
    35         _id = _li.attr('id');
    36     chrome.management.get(_id, function (eInfo) {
    37         if (eInfo.enabled) {
    38             chrome.management.setEnabled(_id, false, function () {
    39                 _able.removeClass('fa-times').addClass('fa-check');
    40             });
    41         } else {
    42             chrome.management.setEnabled(_id, true, function () {
    43                 _able.removeClass('fa-check').addClass('fa-times');
    44             });
    45         }
    46     });
    47 });
    48 
    49 $list.on('click', '.trash', function () {
    50     var _this = $(this),
    51         _li = _this.parents('li'),
    52         _id = _li.attr('id');
    53     chrome.management.uninstall(_id, function () {
    54         if (chrome.runtime.lastError) {
    55             console.log(chrome.runtime.lastError.message);
    56         } else {
    57             _li.fadeOut('normal', function () {
    58                 _li.remove();
    59             });
    60         }
    61     });
    62 });
    63 
    64 function renderList(list) {
    65     $list.html(list.join(''));
    66 }
  • 相关阅读:
    命令模式
    责任链模式
    代理模式
    享元模式
    195 Tenth Line
    test命令
    read命令
    echo命令
    java反射
    http状态码
  • 原文地址:https://www.cnblogs.com/weijiutao/p/11676861.html
Copyright © 2011-2022 走看看