firefox 扩展开发笔记(三):高级ui交互编程

firefox 扩展开发笔记(三):高级ui交互编程

[toc]

前言

前两篇链接
1:firefox 扩展开发笔记(一):jpm 使用实践以及调试
2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟
最新版本的Firefox 终于舍弃了鸡肋的xul布局,可以使用原生的html用作ui交互,插件界面中可以引入 bootstrap jQuery等库,大大简便了布局和高度自定义化,本文以一个随机自定义referer 实例来记录jpm 高级ui交互编程。

界面布局

ui 控件

官方api中提供的ui控件如下

  1. ActionButton 动作按钮
  2. ToggleButton 切换按钮
  3. Frame 框架
  4. Toolbar 工具栏
  5. Sidebar 网站边栏
    具体可以参考官方文档 https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/ui

panel

面板为点击图标或者Toolbar 弹出的页面,声明代码如下

var panel = panels.Panel({
  width:420,
  height:420,
  contentURL: self.data.url("panel.html"),
  contentScriptFile : [ self.data.url("js/jquery.js"),self.data.url("../lib/panel.js")],
  onHide: handleHide
});

/data/panel.html 文件为布局内容

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="css/bootstrap.min.css" >
    <style type="text/css">
        .group {
            margin-top:8px;
            text-align:center;
        }
    </style>

</head>
<body>
    <div class="container">
        <div class="group">
            <label>

                <input type="checkbox" id="toggle" />开启


            </label>
        </div>
        <span class="label label-info">referer 列表</span>

        <div class="group">

            <textarea class="form-control" rows="8" id="referer"></textarea>


        </div>
        
        <span class="label label-info">站点列表</span>

        <div class="group">

            <textarea class="form-control" rows="4" id="site"></textarea>


        </div>
        
        <div class="group">
            <button type="button" class="btn btn-default"  id="save" >保存</button>
        </div>

    </div>
</body>
</html>
 

效果如图

panel_2.png

tab 新页面

panel 界面只适合弹出小型对话框,功能繁琐的页面则需要一个新全浏览器页面。

var tabs = require("sdk/tabs");
tabs.open(data.url("option.html"));

效果

tab_3.png

事件响应

引入对应js文件之后就可以和网页一样写事件响应了,为了简便代码还可以引入jQuery库。

contentScriptFile : [ self.data.url("js/jquery.js"),self.data.url("../lib/panel.js")],

响应代码

$(function() {
    var btn_toggle = $("#toggle");
    var btn_save = $("#save");
    var text_data= $("#referer");
    var text_site= $("#site");
     //初始化界面
    self.port.on("init", function(enable,referer,site) {
        btn_toggle.attr("checked", enable);
        text_data.val(referer);
        text_site.val(site);
    });
    //切换事件
    btn_toggle.click(function() {
        //prefs['enable']= this.checked;
        self.port.emit("toggle", this.checked);    
    });
    //保存事件
    btn_save.click(function() {
        self.port.emit("save",text_data.val(),text_site.val());    
    });

});

ui控件与插件代码交互需要通过一个port对象,提供消息发送和接收,事件交互。
官方文档
https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/port

当点击切换按钮时,对应的交互代码为

panel.port.on("toggle", function(enable) {

  prefs['enable'] = enable ;
  if(enable){

    btn_enable();
    httpRequestObserver.register();
  }
  else{

    btn_disable();
    httpRequestObserver. unregister();
  }
});

又如 main.js 中调用panel.js

var  default_referer=[
'http://www.baidu.com',
'http://www.google.com',
'http://www.hao123.com'];

var default_site=['127.0.0.1'];
if (!ss.storage.referer){
  //赋值
  ss.storage.referer=default_referer;
}

if (!ss.storage.site){

  ss.storage.site=default_site;
}
//取值
var  strReferer=ss.storage.referer.join('\n');
var  strSite=ss.storage.site.join('\n');
panel.port.emit("init",prefs['enable'],strReferer,strSite);

数据储存

数据储存的api sdk/simple-storage,可以自由存取各种数据对象。
官方demo

var ss = require("sdk/simple-storage");
ss.storage.myArray = [1, 1, 2, 3, 5, 8, 13];
ss.storage.myBoolean = true;
ss.storage.myNull = null;
ss.storage.myNumber = 3.1337;
ss.storage.myObject = { a: "foo", b: { c: true }, d: null };
ss.storage.myString = "O frabjous day!";

随机referer 实现

var { ToggleButton } = require('sdk/ui/button/toggle');
var panels = require("sdk/panel");
var self = require("sdk/self");
var prefs = require("sdk/simple-prefs").prefs;
var ss = require("sdk/simple-storage");
var {Cc, Ci} = require("chrome");
var httpRequestObserver =
{
  observe: function(subject, topic, data)
  {


    if (topic == "http-on-modify-request") {
      var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
      var host= httpChannel.originalURI.host;
      //判断是否在站点列表中
      if (ss.storage.site.indexOf(host) >= 0){

        httpChannel.setRequestHeader("Referer", read_referer(), false);
      }

      
    }
  },

  get observerService() {
    return Cc["@mozilla.org/observer-service;1"]
    .getService(Ci.nsIObserverService);
  },
    //注册监听器
  register: function()
  {
    this.observerService.addObserver(this, "http-on-modify-request", false);
  },
    //卸载
  unregister: function()
  {
    this.observerService.removeObserver(this, "http-on-modify-request");
  }
};


引用

1.https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/ui

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

推荐阅读更多精彩内容