Firegestures创建弹出菜单
Firefox 05月 24th, 2009这篇又是关于Firegestures,因为Firegestures实在太好用了,这次来讨论一下Firegestures弹出菜单创建,这篇文章比较长。
用了Firegestures很久了,没了这个扩展还真不习惯,关闭标签页已经条件反射地划“L”(即下右),而不是把鼠标移上去点关闭按钮。一个和两个方向的手势已给我分配完了,三个方向手势也用得七七八八,四个方向也用了几个,我是参考使用频率来分配。
弹出菜单
不过实用的脚本越来越多,手势好像不够用了,而且记住每个手势对应哪个动作还要时间一段时间适应。三个方向的以上手势鼠标行走距离还是多了点,换方向还要有少许停顿,影响操作的流畅度(划下和划右还是比较顺手的)。
不要忘了Firegestures还提供弹出菜单功能!可以看看设置窗口里的自带弹出菜单,有四个。而Firegestures是支持自定义脚本的,理所当然能创建自己的弹出菜单,也就是说Firegestures给你提供额外的右键菜单,那就不需要记下每个手势,不需要划那么多个方向,只需要轻划一下,弹出个菜单,然后选择自己所需的功能,很实用吧。
脚本写法
Firegestures的官网有些例子,来看看弹出菜单的脚本写法,很简单
FireGestures.generatePopup(event,
[
{ label: "菜单显示文字1", oncommand: "命令1;" },
{ label: "菜单显示文字2", oncommand: "命令2;" },
{ label: "菜单显示文字3", oncommand: "命令3;" },
]
);
其中“命令”就是你点击后执行的命令,直接写上去就行了,用分号隔开。之前的《AutoPager简明攻略七-鼠标手势》,就是直接把命令写到双引号之间。比如打开书签和历史侧边栏可以这样写,你可以复制下面代码来试一试。
FireGestures.generatePopup(event,
[
{ label: "显示书签侧边栏", oncommand: "toggleSidebar('viewBookmarksSidebar');" },
{ label: "最小化窗口", oncommand: "window.minimize();" },
{ label: "关闭标签页", oncommand: "gBrowser.removeCurrentTab();" },
]
);
但是这样需要自己找出哪些语句执行哪些动作,得看Firefox的开发者文档,很麻烦,也不实用。如果某个动作需要多个语句才能实现的话,可以用分号隔开,然后就是痛苦了,代码混乱难以阅读。当然有个方式是,封装成一个函数,不过依然能让这段脚本变得很长很长。
所以这篇文章的重点是,通过弹出菜单来调用已存在的手势!
调用外部手势
经过我看了半天的Firegestures源代码,郁闷阅读和探索过程就不分享了。总算发现了一个方法,写了几个工具函数,再去调用Firegestures内部的函数,方便来调用已存在的手势。这三个工具函数如下
- FireGestures.API_runFromCommand,按命令调用
- FireGestures.API_runFromName,按名称调用
- FireGestures.API_runFromDirection,按手势方向调用。
不要给吓倒,其实很简单的。下面是一个例子,你只需关心菜单怎么写就行了,至于这三个函数的定义和完整脚本我放到文章最后。
FireGestures.generatePopup(event,
[
{ label: "按命令调用,显示书签侧边栏", oncommand: "FireGestures.API_runFromCommande('FireGestures:BookmarksSidebar');" },
{ label: "按名称调用,TinyURL 当前网址", oncommand: "FireGestures.API_runFromName('TinyURL 当前网址');" },
{ label: "当手势方向调用,打开历史测边栏", oncommand: "FireGestures.API_runFromDirection('LD');" },
]
);
一个一个函数来解释一下
-
FireGestures.API_runFromCommand
-
FireGestures.API_runFromName
-
FireGestures.API_runFromDirection
这个是按命令来调用
{ label: "按命令调用,显示书签侧边栏", oncommand: "FireGestures.API_runFromCommande('FireGestures:BookmarksSidebar');" },
注意括号里面用的是单引号,值为“FireGestures:BookmarksSidebar”,这个命令是怎么搞来的呢,但你编辑“显示书签侧边栏”的手势,在编辑窗口就看到了这个命令了。
这个函数只对默认自带的手势有用。
这个是按名称调用
{ label: "按名称调用,TinyURL 当前网址", oncommand: "FireGestures.API_runFromName('TinyURL 当前网址');" },
例子是之前的的《创建TinyURL的Firegestures鼠标手势》,这里的命令就是你自己添加的脚本的名称
所以这个函数只对自己添加的手势有用。
这个是按手势方向调用
{ label: "当手势方向调用,打开历史测边栏", oncommand: "FireGestures.API_runFromDirection('LD');" },
这里面的“LD”就是鼠标的方向手势。如果你已经为该动作分配了手势后,你就可以用这个函数来调用,还句话书说你既可以划手势来执行也可以用弹出菜单来执行
这个方法对默认和自己添加的动作都有用,前提是分配了手势。
完整脚本
下面就是第一张截图的完整的示例脚本,菜单代码后面的即是我写工具函数的定义,不要修改也不需要修改。
FireGestures.generatePopup(event,
[
{ label: "TinyURL 当前网址", oncommand: "FireGestures.API_runFromName('TinyURL 当前网址');" },
{ label: "Google 笔记本", oncommand: "FireGestures.API_runFromName('Google 笔记本');" },
{ label: "当前页 Google 快照", oncommand: "FireGestures.API_runFromName('当前页 Google 快照');" },
{ label: "添加到 Google 书签", oncommand: "FireGestures.API_runFromName('添加到 Google 书签');" },
{ label: "当前页历史存档", oncommand: "FireGestures.API_runFromName('当前页历史存档');" },
{ label: "重启 Firefox", oncommand: "FireGestures.API_runFromName('重启 Firefox');" },
{ label: "发送键盘事件", oncommand: "FireGestures.API_runFromName('发送键盘事件');" },
//{ label: "显示历史侧边栏", oncommand: "FireGestures.API_runFromCommand('FireGestures:HistorySidebar');" },
//{ label: "显示历史侧边栏", oncommand: "FireGestures.API_runFromDirection('LR');" },
//{ label: "用 IE 打开", oncommand: "FireGestures.API_runFromName('用 IE 打开');" },
//{ label: "用 Maxthon 打开", oncommand: "FireGestures.API_runFromName('用 Maxthon 打开');" },
]
);
FireGestures.API_runFromName = function(aName) {
var mappingsArray = this._gestureMappings.getMappingsArray();
for (var i = 0; i < mappingsArray.length; i++) {
if(mappingsArray[i][1] == aName)
(new Function("event", mappingsArray[i][2]))(event);
}
}
FireGestures.API_runFromDirection = function(aDirection) {
var command = this._gestureMappings.getCommandForDirection(aDirection);
if (command.type == this._gestureMappings.TYPE_SCRIPT)
(new Function("event", command.value))(event);
else
this._performAction(event, command.value);
}
FireGestures.API_runFromCommand = function(aCommand) {
this._performAction(event, aCommand);
}





最新评论