带选项页面的扩展

参考原文

知识点:

  • options_page
  • localStorage




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

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


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




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

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

localStorage 也有一些限制:

  • 首先是 localStorageCookies 类似,都有域的限制,运行在不同域的 JavaScript 无法调用其他域 localStorage的数据。

  • 其次是单个域在 localStorage 中存储数据的大小通常有限制(虽然 W3C 没有给出限制),对于Chrome这个限制是 5MB。

  • 最后 localStorage 只能储存字符串型的数据,无法保存数组和对象,但可以通过 jointoStringJSON.stringify 等方法先转换成字符串再储存。

通过声明 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);

完成后的效果:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   支持离线 Web 应用开发是 HTML5 的另一个重点。   所谓离线 Web 应用,就是在设备不能上网的情况...
    霜天晓阅读 1,224评论 0 2
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 919评论 0 3
  • 结合两套教学视频所做的Revit软件学习笔记
    柒叶蓁蓁阅读 2,343评论 1 5
  • 第16天·21天OH卡美颜瘦身课 #玩卡不卡·每日一抽# 每一位都可以通过这张卡片觉察自己: 1、直觉他叫什么名字...
    李娟AINI阅读 233评论 0 0
  • 此生还从没写过情书,因为我总觉得爱,不需要说什么,默默行动就好,也根本不能够用言语表达!不曾想过,会有一份爱,连行...
    零度女巫阅读 330评论 0 0

友情链接更多精彩内容