带选项页面的扩展

2018-05-30  本文已影响23人  SingleDiego

参考原文

知识点:




有一些扩展允许用户进行个性化设置,这样就需要向用户提供一个选项页面。Chrome 通过 Manifest 文件的 options_page 属性为开发者提供了这样的接口,可以为扩展指定一个选项页面。

当用户在扩展图标上点击右键,选择菜单中的“选项”后,就会打开这个页面,例如:


对于没有图标的扩展,可以在 chrome://extensions 页面中单击“选项”。




对于网站来说,用户的设置通常保存在 Cookies 中,或者保存在网站服务器的数据库中。对于 JavaScript 来说,一些数据可以保存在变量中,但如果用户重新启动浏览器,这些数据就会消失。那么如何在扩展中保存用户的设置呢?

我们可以使用 HTML5 新增的 localStorage 接口。localStorage
HTML5 新增的方法,它允许 JavaScript 在用户计算机硬盘上永久储存数据(除非用户主动删除)。

localStorage 也有一些限制:

通过声明 unlimitedStorage 权限,Chrome 扩展和应用可以突破这一限制。




下面我们写一个小 Demo 来说明,这个插件根据用户的选项返回豆瓣电影中正在热映的电影和即将上映的电影。相关信息可从以下 API 获得。

编写 manifest.json 文件:

{
    "manifest_version": 2,
    "name": "豆瓣电影",
    "version": "1.0",
    "description": "查看最近热映和准备上映的电影",
    "icons": {
        "16": "images/icon.png",
        "48": "images/icon.png",
        "128": "images/icon.png"
    },

    "browser_action": {
        "default_icon": {
            "19": "images/icon.png",
            "38": "images/icon.png"
        },
        "default_title": "豆瓣电影",
        "default_popup": "popup.html"
    },

    // 指定选项页文件路径
    "options_page": "options.html",

    "permissions": [
        "https://api.douban.com/v2/movie/*"
    ]
}

下面开始编写 options.html 文件:

<html>
    <head>
        <title>类型选项</title>
        <meta charset="utf-8">
    </head>
    <body>
        <form>
            <select name="option" id='option'>
                <option value="in_theaters">正在热映</option>
                <option value="coming_soon">即将上映</option>
            </select>
            <br><br>
            <button id="save">确认</button>
        </form>

        <script src="js/options.js"></script>
    </body>
</html>

在选项页我们做一个下拉选项框和一个确定按钮,来供用户选择。

由于 Chrome 不允许将JavaScript内嵌在HTML文件中,所以我们单独编写一个options.js脚本文件,并在HTML文件中引用它。编写 options.js 文件:

// 从 localStorage 中获取 option,默认值为 "in_theaters"
var option = localStorage.option || "in_theaters";

document.getElementById('option').value = option;

// 根据用户选项把 option 信息保存到 localStorage 中
document.getElementById('save').onclick = function(){
    localStorage.option = document.getElementById('option').value;
    alert('保存成功。');
}

options.js 的代码中可以看到,localStorage 的读取和写入方法很简单,和 JavaScript 中的变量读写方法类似。

localStorage 除了使用 localStorage.namespace 的方法引用和写入数据外,还可以使用 localStorage['namespace'] 的形式。请注意第二种方法
namespace 要用引号包围,单引号和双引号都可以。

如果想彻底删除一个数据,可以使用 localStorage.removeItem('namespace') 方法。

为了显示电影条目,我们为扩展指定了一个 popup 页面,下面来编写 popup.html

<html>
<head>
<style>
* {
    margin: 0;
    padding: 0;
}

body {
    width: 350px;
    height: 500px;
}

#movie_list {
    font-size: 14px;
    padding: 5px;
}
</style>

</head>
<body>

<div id="movie_list"></div>

<script src="js/movie.js"></script>

</body>
</html>

编写 movie.js 文件:

function httpRequest(url, callback){
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
    xhr.setRequestHeader('Content-Type', 'application/xml');
    xhr.onreadystatechange = function(){
        var res = JSON.parse(xhr.responseText);
        callback(res);
    };
    xhr.send(); 
}


function showMovie(res){
    var i;
    var title = res['title']
    var HTML = '<h2>' + title + '</h2> <br>';
    var movies = res['subjects'];
    for (i=0; i<movies.length; i++){
        var movie = movies[i]
        var HTML = HTML + '<li><a href="' + movie.alt + '", target="view_window">' + movie.title + '</a></li><br>';
    }
    document.getElementById('movie_list').innerHTML = HTML;
}


var option = localStorage.option;
// 如果 option 不存在则使用默认值 'in_theaters'
option = option?option:'in_theaters';
var url = 'https://api.douban.com/v2/movie/' + option;
httpRequest(url, showMovie);

完成后的效果:

上一篇下一篇

猜你喜欢

热点阅读