Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

firefox扩展开发(八) :控件激活

firefox扩展开发(九) : command元素

galeki posted @ 2007年8月21日 07:01 in Firefox扩展开发 with tags firefox XUL 扩展 , 9343 阅读

何为command元素?从名字来看似乎和执行的命令有关,先来看个简单例子:

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
  3. <window id="example-window" title="测试的窗口"
  4.         xmlns:html="http://www.w3.org/1999/xhtml"
  5.         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  6.  
  7. <command id="cmd_openhelp" oncommand="alert('Help!');"/>
  8. <button label="Help" command="cmd_openhelp"/>
  9. </window>

第7行就是command元素,每个command元素一般有一个id属性,唯一的标识这个command对象,为了不容易和一般元素的id相冲突,在前面加一个cmd_的前缀是个不错的办法;oncommand属性指定了和这个command对象关联的命令动作。

第8行的button元素就引用了command元素关联的命令动作,在原来的章节中,是通过oncommand属性给控件关联动作,现在只需要用command属性,并把对应的command元素id作为属性值,就可以关联到特定的动作。

看样子我们好像是兜了个大圈子,兜这个圈子有什么好处呢?

  • 首先,可以把表示命令动作的command元素单独保存在一个文件中,从而实现表示界面和表示显示的代码分离,更加容易管理。
  • 另外,如果某些按钮、菜单项、工具栏按钮执行的都是一个动作那么我们主要把他们关联到相同的command元素上即可,而不用重复写好几遍。

而且不仅如此,下面的才是关键:

  • 我们可以disable和enable一个command,如果command元素被设置成disable,那么和它关联的动作命令不会得到执行。
  • disable和enable某个command元素的同时,和这个command元素关联的控件会被自动设置成disable和enable的状态。

看个了例子:

  1. <window id="focus-example" title="测试窗口"
  2.         onload="init();"
  3.         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  4.  
  5. <command id="cmd_openhelp" oncommand="alert('这是帮助');"/>
  6. <button label="帮助" command="cmd_openhelp"/>
  7. <button label="还是帮助" command="cmd_openhelp"/>
  8.  
  9. <button label="禁用帮助"
  10.     oncommand="document.getElementById('cmd_openhelp').setAttribute('disabled','true');"/>
  11. <button label="激活帮助"
  12.     oncommand="document.getElementById('cmd_openhelp').removeAttribute('disabled');"/>
  13. </window>

我们可以通过setAttribute和removeAttribute这两个方法,来设定某个command元素的disable和enable,可以看到,如果disable了cmd_openhelp这个command,和它关联的按钮也自动变成灰色不可点击的状态:

见鬼了 说:
2007年9月21日 00:27

很详细的介绍呀!我全看了一遍;但仍有些疑问想请教一下:我也在做一个firefox插件,用来阻止alert函数的弹出窗口;我的思路是: 在页面加载之前把alert函数重载成一个空函数从而达到目的;但我的问题是如何做到在页面加载之前完成?

Avatar_small
galeki 说:
2007年9月21日 01:53

如果你可以获得当前的window对象的话,应该可以通过 window.alert=function(){return;}; 类似的方式把alert屏蔽掉。

aokihu 说:
2007年9月22日 20:54

这些文章很有用,也很详细,不过介绍了这么多大部分是ui的,能不能介绍下其他方面的,比如后台的一些接口什么的,我想做个ftp上传的

你的这些文章被我转载到了http://www.citsb.net,希望有空来逛逛

Avatar_small
galeki 说:
2007年9月22日 21:53

谢谢关注~

我会介绍接口相关的内容的,因为这也是我对firefox扩展开发的学习笔记,我最后的目标也是能开发一款实用的firefox扩展~

pc2100 说:
2007年10月14日 02:43 谢谢~~ 非常好的教材,很适合我这样的初学者!! 收藏慢慢学习
freezesoul 说:
2007年12月18日 20:05 你好 有个问题请教一下, 关于content 下的js库文件中,是不是支持所有的javascript 语法 在我测试中好像不支持appendChild, 是我代码的问题 还是本身扩展安全的问题
Avatar_small
galeki 说:
2007年12月19日 14:03

应该支持 appendChild 的,你可以参考一下:

http://developer.mozilla.org/en/docs/DOM:element.appendChild

Alva 说:
2008年1月03日 21:20 看完博主的一个系列收获不少,但是我想知道的是,如果我写了一个扩展,那么哪个函数是被火狐第一个加载的函数呢?是在xul的元素吗?如果我不想要一个界面呢?比如跟随firefox一起启动?谢谢
老白 说:
2008年1月09日 20:25 最好能发布点关地网络编程方面的
老白 说:
2008年1月09日 20:26 比如实现FTP,实现即时聊天,谢谢!
老白 说:
2008年1月09日 20:31 我QQ:616941337 一起交流XUL吧!
Head_small
yxjoey 说:
2008年1月10日 06:51 看了有种意犹未尽的感觉
Avatar_small
galeki 说:
2008年1月10日 12:37
引用来自:老白[游客] @ 2008年01月09日 12:25PM
最好能发布点关地网络编程方面的

呵呵,这是我的 ff 扩展学习笔记,所以目前我也就了解到 “command元素” 而已。

我的 MSN 是 yinyuchen456#hotmail.com,QQ 一般不用。  

Avatar_small
galeki 说:
2008年1月10日 12:38
引用来自:yxjoey @ 2008年01月09日 10:51PM
看了有种意犹未尽的感觉

我也一样啊,有空我会继续写的~

swan 说:
2008年4月04日 06:00 谢谢分享,我就快被领入门了,但怎么就没下文了?
Avatar_small
galeki 说:
2008年4月05日 00:15

最近实在是太忙了……

peter 说:
2008年6月05日 00:50

谢谢博主,不过好久没更新,还有没有下文

Avatar_small
galeki 说:
2008年6月05日 01:19

时间不够用了,买了本《Programming Firefox》,到现在还没看……

seven 说:
2008年7月13日 04:55

对我帮助很大,谢谢!

cokebug 说:
2009年11月22日 06:04

楼主,不厚道啊,都带着我们一群俗民到这这层境界了,却没下文了,继续啊。。

Avatar_small
galeki 说:
2009年11月24日 12:17

@cokebug: 啊啊,惭愧啊~~~~泪奔~~~~~~~~

aiyaya 说:
2011年9月28日 09:48

博主,你看这都2011年快到2012了~~~

 

Avatar_small
galeki 说:
2011年10月10日 16:17

惭愧的泪奔~~~ T^T


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter