一个简单的 chrome 插件 -- 二维码生成器

千里之行始于足下,今天写了一个相当简单的 chrome 插件,熟悉一下 chrome 插件的开发流程。

chrome 插件必备一个配置文件,名称为『manifest.json』,所以你可以先新建一个json文件了,其内容很清晰:

{   
    "manifest_version": 2,   //这里必须是2, 由官方规定的
    
    "name": "QRcode tool",  //插件名称
    
    "version": "1.0",  //插件版本
   
    "description": "二维码生成工具",   //插件描述
    
    "icons": {    //插件图标(在插件中心显示)
        "16": "images/icon16.png",
        "48": "images/icon128.png",
        "128": "images/icon128.png"
    },
     
     "options_page": "options.html",  //配置项页面
    
    "browser_action": {       //插件配置
        "default_popup": "qrcode.html",
        "default_titlec": "QRcode tool",
        "default_icon": {   //插件栏的小图标
             "16": "images/icon16.png"
        }
    },
    
    "permissions":["tabs"]   //需要的权限,本插件只需要'tabs'权限
}

详细的介绍放在了文章最后面,不看也没关系。

配置文件介绍完了,接下来就是实现的部分。

qrcode.html 中 DOM 只有两个部分:一部分是 input 输入框,输入框的'value'会被生成一个二维码,另一部分就是一个 div 元素,用于存放生成的二维码。这些 DOM 将会在你点击 chrome 插件图标的时候弹出来。
就像下图一样,因为没有设置图标(全注释掉了),所以插件栏处就显示了一个默认的图标(一个 Q ???)。

插件弹出效果

<!DOCTYPE>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="qrcode.js"></script>
    <script type="text/javascript" src="myqrcode.js"></script>
</head>
<body>
    <input id="text" type="text" value="http://sf.gg" placeholder="在此输入url" style="width:80%" /><br />
    <div id="qrcode" style="width:100px; height:100px; margin-top:15px;"></div>
</body>
</html>

本例子中,生成二维码使用了 qrcode.js 这个库,所以需要引入一下。

myqrcode.js 本js文件使用了 chrome 的chrome.tabs.query api 来获取当前标签的 url ,一个值得注意的是问题是:chrome.tabs.query 返回的是数组,要想获得当前页面的 url 需要使用 tabs[0].url 而不是 tabs.url。

$(document).ready(function(){

    let currentUrl;

    chrome.tabs.query({
        active: true,
        currentWindow: true
        }, (tabs) => {
        currentUrl = tabs[0].url;
        console.log(currentUrl);

        $('#text').val(currentUrl);

        var qrcode = new QRCode(document.getElementById("qrcode"), {
        width : 100,
        height : 100
        });

        function makeCode () {      
            var inputUrl = document.getElementById("text");
            qrcode.makeCode(inputUrl.value);
        }

        makeCode();

        $("#text").
            on("blur", function () {
                makeCode();
            }).
            on("keydown", function (e) {
                if (e.keyCode == 13) {
                    makeCode();
                }
            });
        });

});

把需要的文件都放在文件夹中,然后把整个文件夹拖拽到 chrome://extensions/ 这个窗口里,就可以了。

所有的代码已经在文章内写出来的,如果需要的话, Github地址点此

附录

以下是 manifest.json 文件的具体解释:

manifest_version

manifest_version:插件配置文件 manifest.json 的版本号,是由 chrome 官方发布的。

name

name:插件的名称

description

description:对插件的描述。定义了之后,打开chrome://extensions/,在插件名称的底部可以看到。

version

version:插件的版本

icons

icons:打开扩展程序界面 chrome://extensions/,你会在每个插件的左侧看到对应的图标,这个也就在 manifest.json 定义的 icons 。一般而言,一个插件应用都有一套对应的图标,分别是四种大小的格式(16px, 32px, 48px, 128px)。在不同的分辨率下,chrome会根据不同情况采用不同大小的图标。

值得注意的是,这个属性不是必须的。倘若你未指定 icons,则 chrome 会采用默认的“拼图”图标。

browser_action

browser_action:一般包含 “default_icon”、”default_title” 以及 “default_popup”

  • default_popup

看到带popup字样,我们便能联想到这是关于弹出层的信息。default_popup指定了鼠标点击工具栏右侧插件图标时显示的弹出层,它是一个 html 页面(popup.html),主要用于展示插件内容。我们也可以通过 setPopup 这个 API 来改变popup展示的内容:

  • default_title

指定了鼠标悬停到工具栏右侧插件图标时显示的文字信息,很像普通页面的 。</span> </p> <ul> <li class="md_li"><span>default_icon </span></li> </ul> <p class="md_block"> <span class="md_line md_line_start md_line_end">位于工具栏右侧的插件图标,它的值可以是字符串。也可以是一个对象,当值为对象时,在不同的分辨率会选择不同图标。当未指定图标时,chrome 会采用 icons 中指定的图标。但如果 icons 也没指定图标,那地址栏右侧的图标会变成一个带有“方块?”的深灰色图标,也就是系统默认的图标。</span> </p> <div class="codehilite code_lang_json highlight"><pre><span></span><span class="s2">"browser_action"</span><span class="err">:</span> <span class="p">{</span> <span class="nt">"default_icon"</span><span class="p">:</span> <span class="p">{</span> <span class="nt">"19"</span><span class="p">:</span> <span class="s2">"images/icon19.png"</span><span class="p">,</span> <span class="nt">"38"</span><span class="p">:</span> <span class="s2">"images/icon38.png"</span> <span class="p">}</span> <span class="p">}</span> </pre></div> <!--block_code_end--><h4 id="toc_7" class="h16">permissions</h4> <p class="md_block"> <span class="md_line md_line_start md_line_end">permissions:如果需要使用一些 chrome 的 API,你可能会需要相关的权限,比如在本例子中,你需要使用下列的语句来获得"tab"相关的权限:</span> </p> <pre><code> "permissions":["tabs"]</code></pre> <!--block_code_end--> <p class="md_block"> <span class="md_line md_line_start md_line_end">另外:web 开发中跨域请求是不允许的,如前面讲到的 localstrong 一样,这个规则在 chrome 插件中也被打破。我们可以通过在 permissions 中指定请求的域,在后台 js 文件对这个域发送 ajax,从而完成信息获取。permissions 的值是一个数组,每项是对应的 url 。</span> </p></div> </div> </div> </div> <link href="/fb_static/api/comment/style.css?version=0.0811" type="text/css" rel="stylesheet"/> <div class="doc_comments"> <div class="doc_comments_wrapper"> <div class="comments_block_title">Comments</div> <div class="new_comment_form_container"> <form id="new_comment_form" method="post" action="/service/comment/new"> <input name="path" type="hidden" value="学习类/一个简单的 chrome 插件 -- 二维码生成器.md" /> <input id="reply_to_id" name="reply" type="hidden" value=""/> <div class="comment_trigger"> <div class="avatar"><img src="/visitor.png" /> </div> <div class="trigger_title">Write a Comment</div> </div> <div class="new_comment"><textarea name="content" rows="2" class="textarea_box"></textarea> <span class="comment_error"></span> </div> <div class="comment_triggered"> <div class="input_body"> <ul class="ident"> <li> <input type="text" name="author" placeholder="Name" /> </li> <li> <input type="text" name="email" placeholder="Email" /> </li> <li> <input type="text" name="site" placeholder="Website" /> </li> </ul> <input type="submit" value="Submit!" class="comment_submit_button c_button"/> </div> </div> </form> </div> <ul class="comments"> </ul> <script type="text/javascript" src="/fb_static/lib/js.cookie.js?version=0.0811"></script> <script type="text/javascript" src="/fb_static/lib/textcomplete/jquery.textcomplete.min.js?version=0.0811"></script> <script type="text/javascript" src="/fb_static/api/comment/script.js?version=0.0811"></script> <script>var people=[ "450544693" ]</script> <script>$(".new_comment textarea").textcomplete([{ match: /@(\S*)$/, search: function(term, callback){ callback($.map(people, function(person){ return person.indexOf(term)==0 ? person : null })) }, replace: function(value){ if (value.indexOf(' ')!='-1'){ return '@' + value + ', '; } else{ return '@' + value + ' '; } }, index: 1 }]); </script> </div> </div> </div> </div> </div> <footer id="footer" class="mod-footer"> <div class="contact"></div> <div class="copyright"><span>Powered by</span> <a href="https://www.bitcron.com" target="_blank">Bitcron</a> <span>Theme by</span> <a href="https://www.sollrei.me">Sollrei</a> </div> </footer> <script type="text/javascript" src="/template/js/particles.js?app=blog/sollrei"></script> <script type="text/javascript" src="/template/js/index.js?app=blog/sollrei"></script> </body> </html>