带选项页面的扩展

参考原文

知识点:

  • 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);

完成后的效果:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

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